Làm cách nào để thêm Dấu phân cách dọc?


113

Tôi muốn thêm Dấu phân cách dọc vào Lưới, nhưng tôi chỉ có thể tìm thấy dấu ngang. Không có Thuộc tính, nơi bạn có thể nhập nếu dòng của dấu phân cách là ngang hay dọc?

Tôi đã tìm kiếm rất nhiều, nhưng không tìm thấy một giải pháp ngắn gọn và dễ dàng cho việc này.

Tôi sử dụng .Net Framework 4.0 và Visual Studio Ultimate 2012.

Nếu tôi cố xoay Dấu phân cách ngang 90 độ, nó sẽ mất khả năng "gắn kết" với các Thành phần khác.

Dấu phân tách đã xoay trông như thế này:

<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
bạn không thể chỉ sử dụng một phong cách Rectangle?
paul

1
điều đó hoạt động, nhưng không phải là những gì tôi muốn. dấu phân cách phải là điều khiển để thực hiện điều này. phải có một cách nào đó ^^
Martin Weber

Tôi nghĩ rằng tôi thực sự sử dụng Rectangle bây giờ, ngay cả khi tôi không thích nó
Martin Weber

1
Bordercũng có thể là một giải pháp ..
Mangesh

Câu trả lời:


192

Điều này sẽ làm chính xác những gì tác giả muốn:

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

nếu bạn muốn có dấu phân cách ngang, hãy thay đổi dấu Orientationhiệu StackPanelthành Vertical.


4
Trong trường hợp của tôi, chỉ cần có kiểu trên dấu phân cách, không phải StackPanel bao quanh.
Xtr

Tôi luôn luôn thực hiện a RenderTransform. Phím tắt gọn gàng cần nhớ :)
Ashley Grenon

3
Nên là một câu trả lời, đây là si tốt nhất. Không chắc tại sao lại hiển thị là câu trả lời thứ 3!
Tatranskymedved

Hoạt động hoàn toàn tốt theo cả chiều ngang và chiều dọc Menugiữa MenuItemcác s. Luôn kéo dài độc đáo để phù hợp với chiều cao / chiều rộng của menu.
natiiix

50

Đây không phải là chính xác những gì tác giả yêu cầu, nhưng vẫn còn, nó rất đơn giản và hoạt động chính xác như mong đợi.

Rectangle thực hiện công việc:

<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
Điều này hoạt động tốt trong UWP. Nếu bạn cần một Fill mỏng dòng sử dụng thay vì màu Stroke và thiết lập chiều rộng 3: <Rectangle HorizontalAlignment="Stretch" Height="3" Margin="-1,6" Stroke="Black" Fill="White" />
Anthony Nichols

25

Trước đây, tôi đã sử dụng kiểu được tìm thấy ở đây

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

Bạn cần phải đặt chuyển đổi trong LayoutTransformthay vì RenderTransformđể chuyển đổi xảy ra trong quá trình chuyển Bố cục, không phải trong quá trình kết xuất. Quá trình vượt qua Bố cục xảy ra khi WPF đang cố gắng sắp xếp các điều khiển bố cục và tìm ra bao nhiêu dung lượng mà mỗi điều khiển chiếm bao nhiêu dung lượng, trong khi chuyển Kết xuất xảy ra sau khi vượt qua bố cục khi WPF đang cố gắng hiển thị các điều khiển.

Bạn có thể đọc thêm về sự khác biệt giữa LayoutTransformRenderTransform tại đây hoặc tại đây


Nghe có vẻ tuyệt vời. Tuy nhiên, nó không thay đổi nhiều. Tôi vẫn không thể gắn các điều khiển trong gui-designer của vs2012. Có thể là một lỗi trong vs2012?
Martin Weber

@MartinWeber Tôi không chắc ý của bạn khi "gắn" điều khiển trong VS. Bộ phân tách của bạn được lưu trữ trong loại bảng điều khiển nào? Nếu đó là một DockPanel, bạn sẽ có thể đặt DockPanel.DockSeparatorbất kỳ phía nào bạn muốn nó được gắn vào. Với WPF, bảng lưu trữ điều khiển thường xác định vị trí của điều khiển và đôi khi thậm chí là kích thước mặc định. Nếu bạn là người mới để bố trí WPF, tôi sẽ khuyên bạn nên đọc qua bài viết này: WPF Layouts - Một trực quan Quick Start
Rachel

Cảm ơn các liên kết! Tôi sẽ đọc nó. Có, tôi mới sử dụng WPF. Ý tôi là với "Docking", khi tôi kéo một điều khiển gần một điều khiển khác, tôi sẽ nhận được một đường màu đỏ để tất cả các điều khiển trong một dòng thực sự nằm trên một dòng. chỉ là một người trợ giúp từ vs2012. khi tôi xoay dải phân cách, tôi không nhận được những dòng này nữa.
Martin Weber

1
@MartinWeber Rất tiếc, tôi không thể giúp bạn nhiều hơn - Tôi sử dụng VS2010 và thường không sử dụng trình thiết kế kéo / thả vì tôi thường thấy nó không cần thiết và không thích duy trì mớ hỗn độn XMAL Tôi nghĩ nó tạo ra :) Bạn có lẽ sẽ có may mắn hơn việc tạo ra một câu hỏi mới đặc biệt cho Visual Studio được thiết kế riêng vấn đề của bạn, như câu hỏi này ở đây có vẻ tập trung vào việc làm thế nào để làm cho một tách dọc
Rachel

Cảm ơn về lời khiên của bạn. Tôi sẽ thử XAML mà không có Trình thiết kế và sẽ đọc một số Hướng dẫn. Có lẽ nếu tôi nhận được một sự hiểu biết tốt hơn về những thứ tôi sẽ giải quyết vấn đề bản thân mình;)
Martin Weber

11

Tôi thích sử dụng điều khiển "Dòng". Nó cho phép bạn kiểm soát chính xác vị trí bắt đầu và kết thúc của dải phân cách. Mặc dù nó không chính xác là một dấu phân cách, nhưng nó hoạt động theo cùng một cách, đặc biệt là trong StackPanel.

Điều khiển dòng cũng hoạt động trong một lưới. Tôi thích sử dụng StackPanel hơn vì bạn không phải lo lắng về các điều khiển khác nhau chồng chéo lên nhau.

<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 vị trí bắt đầu (phải là 0 đối với một đường thẳng đứng)

X2 = x vị trí kết thúc (X1 = X2 cho một đường thẳng đứng)

Y1 = y vị trí bắt đầu (phải là 0 đối với một đường thẳng đứng)

Y2 = y vị trí kết thúc (Y2 = chiều cao dòng mong muốn)

Tôi sử dụng "margin" để thêm phần đệm vào bất kỳ phía nào của đường thẳng đứng. Trong trường hợp này, có 5 pixel ở bên trái và 10 pixel ở bên phải của đường thẳng đứng.

Vì điều khiển dòng cho phép bạn chọn tọa độ x và y của điểm bắt đầu và kết thúc của dòng, bạn cũng có thể sử dụng nó cho các đường ngang và đường ở bất kỳ góc nào ở giữa.


2

Đây là một cách làm rất đơn giản, không có chức năng và tất cả hiệu ứng hình ảnh,

Sử dụng lưới và chỉ cần tùy chỉnh nó.

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

Chỉ là một cách khác để làm điều đó.


2
Thông minh!!!! Giải quyết nó theo cách này, nhưng cùng một ý tưởng: <Grid HorizontalAlignment="Stretch" Height="1" Margin="0,10" Background="Black"/>
Anthony Nichols

2

Dấu phân cách dọc

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

dải phân cách ngang

<Rectangle HorizontalAlignment="Stretch" Fill="Blue" Height="4"/>

0

Từ 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 :

Hãy thử ví dụ này và xem nó có phù hợp với nhu cầu của bạn không, có ba khía cạnh chính của nó.

  1. Line.Stretch được thiết lập để điền.

  2. Đối với các đường ngang, Căn chỉnh dọc của đường được đặt Dưới cùng và đối với Dòng dọc, Căn chỉnh ngang được đặt thành Phải.

  3. Sau đó, chúng ta cần cho dòng biết có bao nhiêu hàng hoặc cột để kéo dài, điều này được thực hiện bằng cách liên kết với thuộc tính đếm RowDefinitions hoặc 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}"/>  


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>

sử dụng

<StackPanel  Orientation="Horizontal"  >
       <TextBlock>name</TextBlock>
           <Separator Style="{StaticResource MySeparatorStyle}" ></Separator>
       <Button>preview</Button>
 </StackPanel>

-3

Đây là cách tôi đã làm điều đó:

<TextBlock Margin="0,-2,0,0">|</TextBlock>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.