如何添加垂直分隔符?
我想添加一个垂直分隔符到网格,但我只能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>
如果您需要水平分隔符,请将StackPanel
的Orientation
更改为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尝试呈现控件时,布局传递之后发生渲染传递。
你可以在这里或这里阅读更多关于LayoutTransform
和RenderTransform
的区别
我喜欢使用“线”控件。 它使您能够精确控制分隔符开始和结束的位置。 虽然它不是一个分隔符,但它的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"/>
只是另一种方式来做到这一点。
试试这个例子,看看它是否适合你的需求,它有三个主要方面。
-
Line.Stretch被设置为填充。
-
对于水平线,竖线的VerticalAlignment设置为Bottom,对于VerticalLines,HorizontalAlignment设置为Right。
-
然后,我们需要告诉行要跨越多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}"/>