如何添加垂直分隔符?


113

我想将垂直分隔符添加到网格,但是我只能找到水平分隔符。没有属性,如果分隔线是水平还是垂直,您可以在其中输入?

我进行了很多搜索,但没有找到解决此问题的简便方法。

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

3
您不能只使用样式Rectangle吗?
paul 2012年

1
那行得通,但不是我想要的。分隔符应该是执行此操作的控件。必须有一种方法^^
Martin Weber'Nov

我认为即使我不喜欢,我现在也实际上正在使用Rectangle
Martin Weber

1
Border也可以是一个解决办法..
Mangesh

Answers:


192

这应该正是作者想要的:

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

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


4
在我的情况下,分隔符只需要样式,而不需要封闭的StackPanel。
Xtr

我一直都实施过RenderTransform。记住的整洁捷径:)
阿什莉·格里农

3
应该是一个答案,这是最好的。不知道为什么显示为第三答案!
Tatranskymedved

MenuMenuItems 之间的水平和垂直方向上也能完美工作。总是很好地拉伸以匹配菜单的高度/宽度。
natiiix

50

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

矩形完成这项工作:

<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
这在UWP中效果很好。如果您需要更细的线,请使用“填充”代替“笔触颜色”,并将宽度设置为3: <Rectangle HorizontalAlignment="Stretch" Height="3" Margin="-1,6" Stroke="Black" Fill="White" />
Anthony Nichols

25

过去我使用这里找到的样式

<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尝试对控件进行布局并找出每个控件占用的空间时,将进行Layout传递;而当WPF尝试对控件进行渲染时,将在布局传递之后进行Render传递。

你可以阅读更多有关之间的差异LayoutTransform,并RenderTransform 在此在这里


这听起来很不错。但是,变化不大。我仍然无法将控件停靠在vs2012的GUI设计器中。也许是vs2012中的错误?
马丁·韦伯

@MartinWeber我不确定通过“停靠” VS中的控件意味着什么。您的分隔符托管在哪种类型的面板上?如果它是一个DockPanel,你应该能够设置DockPanel.Dock你的Separator,你想让它停靠到任何一边。使用WPF,托管控件的面板通常确定控件的位置,有时甚至确定默认大小。如果您是WPF布局的新手,我建议您阅读以下文章:WPF布局-视觉快速入门
Rachel 2012年

感谢您的链接!我会读的。是的,我是WPF的新手。我所说的“对接”是指,当我将一个控件拖到另一个控件附近时,会出现一条红线,因此一行中的所有控件实际上都在一行上。只是vs2012的助手。当我旋转分离器时,我不再得到这些线条。
Martin Weber

1
@MartinWeber抱歉,我不能为您提供更多帮助-我使用VS2010,并且通常根本不使用拖放设计器,因为我经常发现它是不必要的,并且不喜欢维护它认为会产生的XMAL混乱:)可能会更好地为您的Visual Studio设计器问题创建一个新问题,因为这里的问题似乎更着重于如何制作垂直分隔符
Rachel

谢谢您的提示。我将在没有Designer的情况下尝试XAML,并将阅读一些教程。也许,如果我对事物有更好的了解,我会自己解决问题;)
Martin Weber 2012年

11

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


2

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

使用网格,只需对其进行自定义即可。

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

只是另一种方式。


2
优秀的!!!!通过这种方式解决了这个问题,但想法相同: <Grid HorizontalAlignment="Stretch" Height="1" Margin="0,10" Background="Black"/>
Anthony Nichols


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,对于垂直线,Horizo​​ntalAlignment设置为Right。

  3. 然后,我们需要告诉该行要跨越多少行或列,这是通过绑定到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}"/>  


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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.