Come aggiungere un separatore verticale?


114

Voglio aggiungere un separatore verticale a una griglia, ma posso trovare solo l'orizzontale. Non c'è una proprietà, dove puoi inserire se la linea del separatore deve essere orizzontale o verticale?

Ho cercato molto, ma non ho trovato una soluzione breve e facile.

Uso .Net Framework 4.0 e Visual Studio Ultimate 2012.

Se provo a ruotare il Separatore orizzontale di 90 gradi, perde la capacità di "agganciarsi" ad altri componenti.

Il separatore ruotato ha questo aspetto:

<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
non puoi semplicemente usare uno stile Rectangle?
paul

1
funziona, ma non è quello che voglio. il separatore dovrebbe essere il controllo per farlo. ci deve essere un modo ^^
Martin Weber,

Penso di utilizzare il rettangolo ora, anche se non mi piace
Martin Weber,

1
Borderpuò anche essere una soluzione ..
Mangesh

Risposte:


193

Questo dovrebbe fare esattamente quello che voleva l'autore:

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

se vuoi un separatore orizzontale, cambia il Orientationdel StackPanela Vertical.


4
Nel mio caso era necessario solo lo stile sul separatore, non lo StackPanel che lo racchiude.
Xtr

Ho sempre implementato un file RenderTransform. Bella scorciatoia da ricordare :)
Ashley Grenon

3
Dovrebbe essere una risposta, questa è la migliore. Non so perché viene visualizzato come terza risposta!
Tatranskymedved

Funziona perfettamente anche in orizzontale e in verticale Menutra le MenuItems. Si allunga sempre bene per adattarsi all'altezza / larghezza del menu.
natiiix

50

Questo non è esattamente ciò che l'autore ha chiesto, ma è comunque molto semplice e funziona esattamente come previsto.

Rectangle fa il lavoro:

<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
Funziona alla grande in UWP. Se hai bisogno di una linea più sottile usa Riempi invece di Colore tratto e imposta la larghezza su 3: <Rectangle HorizontalAlignment="Stretch" Height="3" Margin="-1,6" Stroke="Black" Fill="White" />
Anthony Nichols

25

In passato ho usato lo stile trovato qui

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

È necessario impostare la trasformazione LayoutTransforminvece di in RenderTransformmodo che la trasformazione avvenga durante il passaggio di layout, non durante il passaggio di rendering. Il passaggio di layout si verifica quando WPF tenta di disporre i controlli e di capire quanto spazio occupa ciascun controllo, mentre il passaggio di rendering si verifica dopo il passaggio di layout quando WPF tenta di eseguire il rendering dei controlli.

Puoi leggere di più sulla differenza tra LayoutTransforme RenderTransform qui o qui


Suona bene. Tuttavia, non cambia molto. Non riesco ancora a collegare i controlli al gui-designer di vs2012. Forse un bug in vs2012?
Martin Weber

@ MartinWeber Non sono sicuro di cosa intendi per "agganciare" il controllo in VS. In che tipo di pannello è ospitato il tuo separatore? Se è a DockPanel, dovresti essere in grado di posizionarti DockPanel.Docksul Separatorlato a cui vuoi che sia agganciato. Con WPF, il pannello che ospita il controllo di solito determina la posizione del controllo e talvolta anche la dimensione predefinita. Se sei nuovo ai layout di WPF, ti consiglio di leggere questo articolo: Layout di WPF - A Visual Quick Start
Rachel

Grazie per il collegamento! Lo leggerò. Sì, sono nuovo in WPF. Con "Docking" intendevo, quando trascino un controllo vicino a un altro ottengo una linea rossa in modo che tutti i controlli in una linea siano effettivamente su una linea. solo un aiuto da vs2012. quando ruoto il separatore, non ottengo più queste righe.
Martin Weber

1
@MartinWeber Scusa non posso aiutarti di più - Uso VS2010 e normalmente non uso affatto il designer drag / drop perché spesso lo trovo non necessario e non mi piace mantenere il pasticcio XMAL che penso generi :) Tu probabilmente avresti più fortuna nel creare una nuova domanda specifica per il tuo problema di progettazione di Visual Studio, poiché questa domanda qui sembra più focalizzata su come creare un separatore verticale
Rachel

Grazie per i consigli. Proverò XAML senza Designer e leggerò alcuni tutorial. Forse se avrò una migliore comprensione delle cose risolverò il problema da solo;)
Martin Weber

11

Mi piace usare il controllo "Line". Ti dà il controllo esatto su dove inizia e finisce il separatore. Sebbene non sia esattamente un separatore, funziona allo stesso modo, specialmente in uno StackPanel.

Il controllo di linea funziona anche all'interno di una griglia. Preferisco usare StackPanel perché non devi preoccuparti della sovrapposizione di diversi controlli.

<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 posizione iniziale (dovrebbe essere 0 per una linea verticale)

X2 = x posizione finale (X1 = X2 per una linea verticale)

Y1 = y posizione iniziale (dovrebbe essere 0 per una linea verticale)

Y2 = posizione finale y (Y2 = altezza linea desiderata)

Uso "margin" per aggiungere imbottitura su qualsiasi lato della linea verticale. In questo caso, ci sono 5 pixel a sinistra e 10 pixel a destra della linea verticale.

Poiché il controllo della linea ti consente di scegliere le coordinate xey dell'inizio e della fine della linea, puoi anche usarlo per linee orizzontali e linee con qualsiasi angolo intermedio.


2

Questo è un modo molto semplice per farlo senza funzionalità e tutti gli effetti visivi,

Usa una griglia e personalizzala semplicemente.

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

Solo un altro modo per farlo.


2
Eccellente!!!! Risolto in questo modo, ma stessa idea: <Grid HorizontalAlignment="Stretch" Height="1" Margin="0,10" Background="Black"/>
Anthony Nichols,

2

Separatore verticale

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

separatore orizzontale

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

0

Da http://social.msdn.microsoft.com/Forums/vstudio/en-US/12ead5d4-1d57-4dbb-ba81-bc13084ba370/how-can-i-add-a-line-as-a-visual-separator -alla-griglia-come-controllo-contenuto? forum = wpf :

Prova questo esempio e vedi se si adatta alle tue esigenze, ci sono tre aspetti principali.

  1. Line.Stretch è impostato per riempire.

  2. Per le linee orizzontali, l'allineamento verticale della linea è impostato in basso e per le linee verticali l'allineamento orizzontale è impostato su destra.

  3. Dobbiamo quindi dire alla riga quante righe o colonne si estendono, questo viene fatto collegando alla proprietà RowDefinitions o 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>

uso

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.