133

我想在网格中添加一个垂直分隔符,但我只能找到水平分隔符。是不是有一个Property,如果分隔符的线应该是水平的还是垂直的,您可以在其中输入?

我搜索了很多,但没有找到一个简短而简单的解决方案。

我使用 .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>
4

11 回答 11

219

这应该完全符合作者的要求:

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

如果您想要水平分隔符,请将Orientation的更改StackPanelVertical

于 2014-04-24T22:25:49.833 回答
58

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

矩形完成这项工作:

<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>
于 2014-03-20T10:56:57.433 回答
26

过去我使用过这里的风格

<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 尝试呈现控件时布局过程之后。

您可以在此处此处阅读有关与之间的区别的更多LayoutTransform信息RenderTransform

于 2012-11-27T15:11:22.747 回答
13

我喜欢使用“线”控件。它使您可以精确控制分隔符的开始和结束位置。虽然它不完全是分隔符,但它的功能是相同的,尤其是在 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 坐标,因此您也可以将它用于水平线和中间任意角度的线。

于 2016-06-19T04:50:47.813 回答
11

垂直分隔符

<Rectangle VerticalAlignment="Stretch" Fill="Blue" Width="1"/>

水平分隔符

<Rectangle HorizontalAlignment="Stretch" Fill="Blue" Height="4"/>
于 2019-09-13T14:09:23.900 回答
2

这是一种非常简单的方法,没有任何功能和所有视觉效果,

使用网格并简单地自定义它。

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

只是另一种方法。

于 2016-01-27T14:58:25.113 回答
1

现在每个人都应该清楚,让 WPF 分隔符看起来垂直是非常困难的。

分隔符默认是水平的,没有Orientation属性,放在水平方向的StackPanel.

事实上,让分隔符看起来垂直是非常困难的,以至于许多答案建议使用 aRectangle或 aLine而不是 a Separator,这很不酷,而且承认失败。

一个答案建议使用ToolBar.SeparatorStyleKey,它已经存在并且可以完成这项工作。但是,我并不特别喜欢这个解决方案,因为我想在与工具栏无关的地方使用我的分隔符,所以在这些上下文中提到工具栏是一个红鲱鱼。

另一个答案建议使用RotateTransform90 度角,这也可以,但是您必须设置Width属性才能指定分隔符的高度,我不喜欢这样。

因此,我所做的是获取 ToolBar 分隔符样式的来源,并将其剥离到可以完成这项工作的最低限度。我完全不清楚为什么以下魔法咒语会达到预期的效果,但确实如此:

<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 的故事:它是通过魔法咒语进行编程的。)

于 2021-03-08T09:54:54.063 回答
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 -to-the-content-control-like-grid?forum=wpf

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

  1. Line.Stretch 设置为填充。

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

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



        <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}"/>  
    

于 2014-10-06T19:58:10.170 回答
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>
于 2020-04-01T08:03:54.173 回答
0

做垂直分隔符的另一种方法。

<GridSplitter Width="3" ResizeBehavior="PreviousAndNext" ResizeDirection="Columns" />

它还提供调整列和行的大小。

于 2022-03-03T09:09:55.290 回答
-2

这是我的做法:

<TextBlock Margin="0,-2,0,0">|</TextBlock>
于 2019-07-02T14:34:40.017 回答