如何添加垂直分隔符?

我想添加一个垂直分隔符到网格,但我只能find水平。 是不是有一个属性,你可以input,如果分隔线应水平或垂直?

我搜查了很多,但没有find一个简短的解决scheme。

我使用.Net Framework 4.0和Visual Studio Ultimate 2012。

如果我尝试将水平分隔符旋转90度,则会丧失“停靠”到其他组件的能力。

旋转后的分隔符如下所示:

<Separator HorizontalAlignment="Left" Height="100" Margin="264,26,0,0" VerticalAlignment="Top" Width="100" RenderTransformOrigin="0.5,0.5"> <Separator.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="90"/> <TranslateTransform/> </TransformGroup> </Separator.RenderTransform> </Separator> 

这应该完全是作者想要的:

 <StackPanel Orientation="Horizontal"> <Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" /> </StackPanel> 

如果您需要水平分隔符,请将StackPanelOrientation更改为Vertical

这并不是作者所要求的,但它仍然非常简单,并且完全按照预期工作。

矩形做这个工作:

 <StackPanel Grid.Column="2" Orientation="Horizontal"> <Button >Next</Button> <Button >Prev</Button> <Rectangle VerticalAlignment="Stretch" Width="1" Margin="2" Stroke="Black" /> <Button>Filter all</Button> </StackPanel> 

在过去,我使用了这里find的风格

 <Style x:Key="VerticalSeparatorStyle" TargetType="{x:Type Separator}" BasedOn="{StaticResource {x:Type Separator}}"> <Setter Property="Margin" Value="6,0,6,0"/> <Setter Property="LayoutTransform"> <Setter.Value> <TransformGroup> <TransformGroup.Children> <TransformCollection> <RotateTransform Angle="90"/> </TransformCollection> </TransformGroup.Children> </TransformGroup> </Setter.Value> </Setter> </Style> <Separator Style="{DynamicResource VerticalSeparatorStyle}" /> 

您需要在LayoutTransform设置变换而不是RenderTransform以便在布局过程中进行转换,而不是在渲染过程中进行转换。 当WPF尝试布局控件并找出每个控件占用了多less空间时,会发生布局传递,而当WPF尝试呈现控件时,布局传递之后发生渲染传递。

你可以在这里或这里阅读更多关于LayoutTransformRenderTransform的区别

我喜欢使用“线”控件。 它使您能够精确控制分隔符开始和结束的位置。 虽然它不是一个分隔符,但它的function是一样的,特别是在一个StackPanel中。

线控也在网格内工作。 我更喜欢使用StackPanel,因为您不必担心不同的控件重叠。

 <StackPanel Orientation="Horizontal"> <Button Content="Button 1" Height="20" Width="70"/> <Line X1="0" X2="0" Y1="0" Y2="20" Stroke="Black" StrokeThickness="0.5" Margin="5,0,10,0"/> <Button Content="Button 2" Height="20" Width="70"/> </StackPanel> 

X1 = x起始位置(垂直线应为0)

X2 = x结束位置(X1 = X2代表垂直线)

Y1 = y的起始位置(垂直线应为0)

Y2 = y结束位置(Y2 =所需线高度)

我使用“边距”在垂直线的任何一侧添加填充。 在这种情况下,垂直线的左侧有5个像素,右侧有10个像素。

由于线控制允许您选取线的开始和结束的x和y坐标,您还可以将它用于水平线和线之间的任何angular度。

这是一个非常简单的方法,它没有任何function和所有的视觉效果,

使用网格,只需简单地定制它。

 <Grid Background="DodgerBlue" Height="250" Width="1" VerticalAlignment="Center" Margin="5,0,5,0"/> 

只是另一种方式来做到这一点。

http://social.msdn.microsoft.com/Forums/vstudio/en-US/12ead5d4-1d57-4dbb-ba81-bc13084ba370/how-can-i-add-a-line-as-a-visual-separator内容控制像网格?forum = wpf :

试试这个例子,看看它是否适合你的需求,它有三个主要方面。

  1. Line.Stretch被设置为填充。

  2. 对于水平线,竖线的VerticalAlignment设置为Bottom,对于VerticalLines,Horizo​​ntalAlignment设置为Right。

  3. 然后,我们需要告诉行要跨越多less行或列,这是通过绑定到RowDefinitions或ColumnDefintions count属性来完成的。

      <Style x:Key="horizontalLineStyle" TargetType="Line" BasedOn="{StaticResource lineStyle}"> <Setter Property="X2" Value="1" /> <Setter Property="VerticalAlignment" Value="Bottom" /> <Setter Property="Grid.ColumnSpan" Value="{Binding Path=ColumnDefinitions.Count, RelativeSource={RelativeSource AncestorType=Grid}}"/> </Style> <Style x:Key="verticalLineStyle" TargetType="Line" BasedOn="{StaticResource lineStyle}"> <Setter Property="Y2" Value="1" /> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Grid.RowSpan" Value="{Binding Path=RowDefinitions.Count, RelativeSource={RelativeSource AncestorType=Grid}}"/> </Style> </Grid.Resources> <Grid.RowDefinitions> <RowDefinition Height="20"/> <RowDefinition Height="20"/> <RowDefinition Height="20"/> <RowDefinition Height="20"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="20"/> <ColumnDefinition Width="20"/> <ColumnDefinition Width="20"/> <ColumnDefinition Width="20"/> </Grid.ColumnDefinitions> <Line Grid.Column="0" Style="{StaticResource verticalLineStyle}"/> <Line Grid.Column="1" Style="{StaticResource verticalLineStyle}"/> <Line Grid.Column="2" Style="{StaticResource verticalLineStyle}"/> <Line Grid.Column="3" Style="{StaticResource verticalLineStyle}"/> <Line Grid.Row="0" Style="{StaticResource horizontalLineStyle}"/> <Line Grid.Row="1" Style="{StaticResource horizontalLineStyle}"/> <Line Grid.Row="2" Style="{StaticResource horizontalLineStyle}"/> <Line Grid.Row="3" Style="{StaticResource horizontalLineStyle}"/>