我想在Grid中添加一个垂直分隔符,但我只能找到水平分隔符。 是否有属性,如果分隔符的行应该是水平的还是垂直的,您可以输入?
我搜索了很多,但没有找到一个简单易行的解决方案。
我使用.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>
答案 0 :(得分:151)
这应该完全符合作者的要求:
<StackPanel Orientation="Horizontal">
<Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
</StackPanel>
如果您需要水平分隔符,请将Orientation
的{{1}}更改为StackPanel
。
答案 1 :(得分:43)
这并不是作者所要求的,但它仍然非常简单,并且完全符合预期。
Rectangle完成工作:
<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>
答案 2 :(得分:20)
在过去,我使用了here
找到的样式<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尝试布局控件并计算出每个控件占用多少空间时,会发生布局传递,而当WPF尝试渲染控件时,布局传递后会发生渲染传递。
答案 3 :(得分:7)
我喜欢使用“Line”控件。它可以精确控制分隔符的开始和结束位置。虽然它不完全是分隔符,但它的功能是相同的,特别是在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 =期望的线高)
我使用“margin”在垂直线的任何一侧添加填充。在这种情况下,左边有5个像素,垂直线右边有10个像素。
由于线控制允许您选择线的起点和终点的x和y坐标,因此您也可以将它用于水平线和线之间的任何角度。
答案 4 :(得分:2)
这是一种非常简单的方法,没有任何功能和所有视觉效果,
使用网格,只需自定义即可。
<Grid Background="DodgerBlue" Height="250" Width="1" VerticalAlignment="Center" Margin="5,0,5,0"/>
另一种方法。
答案 5 :(得分:0)
试试这个例子,看它是否符合你的需要,它有三个主要方面。
Line.Stretch设置为填充。
对于水平线,线的VerticalAlignment设置为Bottom,而对于VerticalLines,HorizontalAlignment设置为Right。
然后我们需要告诉该行要跨越多少行或列,这可以通过绑定到RowDefinitions或ColumnDefintions计数属性来完成。
<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}"/>
答案 6 :(得分:0)
垂直分隔符
<Rectangle VerticalAlignment="Stretch" Fill="Blue" Width="1"/>
水平分隔符
<Rectangle HorizontalAlignment="Stretch" Fill="Blue" Height="4"/>
答案 7 :(得分:0)
<Style x:Key="MySeparatorStyle" TargetType="{x:Type Separator}">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>
<Setter Property="Margin" Value="10,0,10,0"/>
<Setter Property="Focusable" Value="false"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Separator}">
<Border
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
Height="20"
Width="3"
SnapsToDevicePixels="true"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
使用
<StackPanel Orientation="Horizontal" >
<TextBlock>name</TextBlock>
<Separator Style="{StaticResource MySeparatorStyle}" ></Separator>
<Button>preview</Button>
</StackPanel>
答案 8 :(得分:0)
现在每个人都应该清楚,让 WPF 分隔符看起来垂直是非常困难的。
分隔符默认是水平的,它没有 Orientation
属性,也不会因为被放置在水平方向的 StackPanel
中而得到任何提示。
事实上,让分隔符看起来垂直是非常困难的,许多答案建议使用 Rectangle
或 Line
而不是 Separator
,这很不酷它承认失败。
One answer 建议使用 ToolBar.SeparatorStyleKey
,它已经存在并且可以完成工作。但是,我不是特别喜欢这个解决方案,因为我想在与工具栏无关的地方使用我的分隔符,所以在这些上下文中提到工具栏是一种红鲱鱼。
Another answer 建议使用角度为 90 度的 RotateTransform
,这也有效,但是您必须设置 Width
属性以指定分隔符的高度,并且我不喜欢这个。
所以,我所做的是获取 ToolBar Separator Style 的来源,并将其精简到可以完成工作的最低限度。我完全不清楚为什么以下魔法咒语能达到预期的效果,但确实如此:
<Style x:Key="VerticalSeparatorStyle" TargetType="Separator">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Separator">
<Border Background="{TemplateBinding Panel.Background}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
使用如下:
<Separator Width="1" Margin="10 3 10 3" Background="Black" Style="
{StaticResource VerticalSeparatorStyle}" />
(这就是 WPF 的故事:它是通过魔法咒语编程。)
答案 9 :(得分:-1)
这是我的做法:
<TextBlock Margin="0,-2,0,0">|</TextBlock>