我希望GridSplitter只有当用户将鼠标放在它上面时才能看到它.为此我正在设计DataTrigger它的风格.但我无法弄清楚它是什么错,因为我没有得到理想的行为.它保持不变.
<GridSplitter
ResizeDirection="Columns"
ResizeBehavior="BasedOnAlignment"
Grid.Column="1"
Grid.Row="0"
Grid.RowSpan="2"
Width="8"
Height="Auto"
HorizontalAlignment="Left"
VerticalAlignment="Stretch"
Background="AliceBlue"
Margin="-3 0 0 0">
<GridSplitter.Style>
<Style TargetType="{x:Type GridSplitter}">
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver}">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</GridSplitter.Style>
</GridSplitter>
Run Code Online (Sandbox Code Playgroud)
你看错了吗?是否GridSplitter必须以不同的方式来称呼?
我想从下面的问题中找到扩展器(参见接受的答案),这对我来说是一个完美的解决方案.我只想把它放在右边.
为了让它从右向左扩展,我改变了类似行为的设置.(我强调了能够更好地了解正在发生的事情的因素):
<Expander Grid.Column="1" Header="Test" ExpandDirection="Left"
BorderThickness="10" BorderBrush="Black" HorizontalAlignment="Right" >
<Expander.Content>
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<GridSplitter Grid.Column="0" Width="10" Background="Green"
ResizeDirection="Columns" ResizeBehavior="CurrentAndNext" />
<TextBox Grid.Column="1" Text="Lorem ipsum dolor sit"
BorderThickness="10" BorderBrush="Red"/>
</Grid>
</Expander.Content>
</Expander>
Run Code Online (Sandbox Code Playgroud)
当我将分离器向右移动时,它会调整分离器左侧区域的大小.我尝试了很多其他组合,但它几乎导致了相同的不良行为.分离器左侧区域有时会发生奇怪的爆炸,但TextBox保持不变.
我有一个2列的网格,由GridSplitter使用以下XAML代码分隔:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" MinWidth="20" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" MinWidth="100" />
</Grid.ColumnDefinitions>
<Rectangle Fill="Blue" />
<GridSplitter Grid.Column="1" Background="LightGray" HorizontalAlignment="Stretch" />
<Rectangle Fill="Yellow" Grid.Column="2" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
问题:忽略右侧列的MinWidth
*我知道之前已经解决了,但它始终建议将列大小设置为*或在第一列设置maxWidth ...我不希望这样.
找到了解决方案,但它的UGLY!:p,任何人都有更清洁的方式来实现我想要的...... CODELESS(如果可能的话)?
private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
var g = (Grid)sender;
Double maxW = e.NewSize.Width - g.ColumnDefinitions[2].MinWidth - g.ColumnDefinitions[1].ActualWidth;
g.ColumnDefinitions[0].MaxWidth = maxW;
}
Run Code Online (Sandbox Code Playgroud) Gridsplitter麻烦:
我有一个:4列的网格
当栅格切割器向左或向右移动时,两个面板收缩相同的量 - 一个应缩小,另一个应该增长.
我对包含xaml犹豫不决,但你会要求它,所以这里是一个删节版本.我只删除了一些不相关的控件,并删除了treeviews和listviews.如果你真的需要整件事,那我当然可以提供它.
谢谢你的帮助!
<Window x:Class="Calvin.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="Calvin" >
<DockPanel Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" LastChildFill="True" >
<Grid DockPanel.Dock="Top" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" RenderTransformOrigin="0.5,0.497" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="5" />
<ColumnDefinition Width="20" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="5" />
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" TextWrapping="NoWrap" Text="Field …Run Code Online (Sandbox Code Playgroud) 我需要一个水平或垂直堆叠项目的布局。每个项目应该由一个拆分器分隔,因此用户可以更改大小(如 VisualStudio 中的工具箱容器)项目来自模型,所以我需要一个 ItemsControl,我可以在其中设置 ItemsSource。
我的第一个想法是构建一个从 Grid 派生的 CustomControl。他们的我使用“OnVisualChildrenChanged”方法在添加新项目时做出反应。然后我想添加新的 Column-/Rowdefinitions(取决于它应该是水平的还是垂直的)。但这是第一个问题。当网格设置为 IsItemsHost="true" 时,我收到一个错误,说明 DefinitionsCollection 不可访问...
这是自定义控件中的 CodeSnipped,我尝试在其中添加一行。
private void SetRows()
{
this.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto };
}
protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
{
base.OnVisualChildrenChanged(visualAdded, visualRemoved);
SetRows();
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我想我现在找到了解决方案。
首先,我创建了一个派生自 ItemsControl 的 CustomControl。在他的模板中,我添加了一个网格而不插入一个 Itempresenter。现在我覆盖 OnItemsChange。当一个项目被添加到集合中时,我创建一个 FrameworkElement 并将 DataContext 设置为添加的项目,然后我将两个列定义添加到网格并将我的项目和一个 Gridsplitter 添加到网格。这很有效,现在我只需要从我的 Itemscontrol 中获取 ItemTemplate 即可在网格中使用它。
当我解决了最后一个问题时,我将添加一个小例子。
我GridSplitter在我的WPF应用程序中使用了一个,并希望从代码中将其设置为特定的初始位置.我一直坚持GridSplitter将特定值设置为Height关联属性时的行为RowDefinition.
这是我举例说明这个问题.我已添加TextBlocks以显示RowDefinition.Height属性的实际值.
<Grid>
<Grid.RowDefinitions>
<RowDefinition x:Name="RowDef1" Height="*" MinHeight="20"/>
<RowDefinition Height="Auto" />
<RowDefinition x:Name="RowDef2" Height="*" MinHeight="20"/>
</Grid.RowDefinitions>
<DockPanel Grid.Row="0" LastChildFill="True" >
<TextBlock FontSize="16" VerticalAlignment="Top" Text="Upside Height: "/>
<TextBlock x:Name="Tbl1" FontSize="16" Text="{Binding Height}"/>
</DockPanel>
<GridSplitter Grid.Row="1" Height="10" HorizontalAlignment="Stretch" ResizeBehavior="PreviousAndNext" Background="Black" />
<DockPanel Grid.Row="2" LastChildFill="True" >
<TextBlock FontSize="16" VerticalAlignment="Top" Text="Downside Height: "/>
<TextBlock x:Name="Tbl2" FontSize="16" Text="{Binding Height}"/>
</DockPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
namespace WpfGridSplitterTest
{
public partial class MainWindow : Window
{ …Run Code Online (Sandbox Code Playgroud) 我有一个简单的Window看起来像这样:
<Window x:Class="StackOverflowExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="3*" />
<RowDefinition Height="2*" />
</Grid.RowDefinitions>
<Label Content="Foo" Margin="5" />
<Label Grid.Row="1" Content="Bar" Margin="5" />
<GridSplitter Grid.Row="1" Background="Black" VerticalAlignment="Top" Height="5" />
</Grid>
</Window>
// The code-behind is empty, except for "InitializeComponent()".
Run Code Online (Sandbox Code Playgroud)
但是,当我运行应用程序时,没有GridSplitter可见的.GridSplitter在设计时我也看不到.
GridSplitter在正确的行中,然后设置VerticalAlignment为TopGridSplitter不混入.GridSplitter是最后一个元素Grid,所以我不应该ZIndex遇到问题.我究竟做错了什么?
我是WPF的新手,所以请原谅我,如果这是"旧帽子"这些天......已经在网上/论坛上搜索过,并且找不到我需要的答案:
我有一个包含5列的WPF网格 - 三个用于数据,两个用于网格分割器,这(感谢此网站上的信息!)似乎可以正常工作并调整大小.但是 - 我需要能够显示/隐藏中间列.我可以这样做,但是当我隐藏中间列时,左手网格探测器仍会影响"隐藏"列 - 我需要有效地在2和3列之间切换.这是我的(原型)代码:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Name="Col0" Width="*" />
<ColumnDefinition Name="Col1" Width="auto" />
<ColumnDefinition Name="Col2" Width="*" />
<ColumnDefinition Name="Col3" Width="auto" />
<ColumnDefinition Name="Col4" Width="auto" />
</Grid.ColumnDefinitions>
<GridSplitter Grid.Column="1" Height="100" HorizontalAlignment="Center" Margin="0" Name="GridSplitter1" VerticalAlignment="Stretch" Width="3" />
<GridSplitter Grid.Column="3" Height="100" HorizontalAlignment="Center" Margin="0" Name="GridSplitter2" VerticalAlignment="Stretch" Width="3" />
<Border BorderBrush="Silver" BorderThickness="1" Grid.Column="0" HorizontalAlignment="Stretch" Margin="0" Name="Border1" VerticalAlignment="Stretch" Background="#FFC84797" />
<Border BorderBrush="Silver" BorderThickness="1" Grid.Column="2" HorizontalAlignment="Stretch" Margin="0" Name="Border2" VerticalAlignment="Stretch" Background="Black" />
<Border BorderBrush="Silver" BorderThickness="1" Grid.Column="4" HorizontalAlignment="Stretch" Margin="0" Name="Border3" VerticalAlignment="Stretch" Background="#FFA60000">
<Button Content="hide" …Run Code Online (Sandbox Code Playgroud) 我发现没有像“DragBackground”之类的 GridSplitter 属性很奇怪。
不过,这似乎有效:
<UserControl.Resources>
<Style x:Key="CustomGridSplitterStyle" TargetType="GridSplitter">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="GridSplitter">
<Grid x:Name="Root" >
<!-- Background -->
<Rectangle Fill="White" StrokeThickness="0" />
<!-- Focus Visual -->
<Rectangle x:Name="FocusVisual" Stroke="White" StrokeThickness="1" Opacity="0" IsHitTestVisible="false" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)
GridSplitter Style="{StaticResource CustomGridSplitterStyle}" Grid.Column="1" Width="6" HorizontalAlignment="Stretch"
BorderThickness="2,0,0,0" BorderBrush="Blue" />
Run Code Online (Sandbox Code Playgroud)
然而,我对这个解决方案的问题是我想在 GridSplitter 的左侧设置一个边框(见上文),这在使用自定义 GridSplitter 样式时不起作用。
有谁知道如何让这个工作?
我有一个网格,我试图把垂直和水平GridSplitters.这是我的主要网格,我希望它尽可能流畅.
在我的第二个定义中,我得到了"Missing Grid.Column setter for non-first child"
我发现了很多关于实现其中一个的文档.我没有发现任何迹象表明我可以做到这两点.但是,我们的行业是由想要推动功能的人组成的.
这是我的XAML:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*"></ColumnDefinition>
<ColumnDefinition Width="5"></ColumnDefinition>
<ColumnDefinition Width="50*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="50*"></RowDefinition>
<RowDefinition Height="5"></RowDefinition>
<RowDefinition Height="50*"></RowDefinition>
</Grid.RowDefinitions>
<GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch"></GridSplitter>
<GridSplitter Grid.Row="1" Height="5" HorizontalAlignment="Stretch"></GridSplitter>
Run Code Online (Sandbox Code Playgroud)
gridsplitter ×10
wpf ×10
xaml ×4
grid ×3
c# ×2
.net ×1
expander ×1
itemscontrol ×1
layout ×1
silverlight ×1
visibility ×1