2009-11-03 14 views
18

Voglio modellare il mio GridSplitter come aggiungere punti su di esso (come trovato su http://msdn.microsoft.com/en-us/library/aa970265.aspx).Styling GridSplitter wpf C#

Voglio anche cambiare il colore di gridsplitter su mouseOver o applicare Aero Theme.

<Style x:Key="GridSplitterStyle1" TargetType="{x:Type GridSplitter}"> 
    <Setter Property="Background" 
      Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
    <Setter Property="PreviewStyle"> 
    <Setter.Value> 
     <Style> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
      <ControlTemplate> 
       <Rectangle Fill="#80000000"/> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type GridSplitter}"> 
     <Border Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}"/> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

<!--Theme--> 
<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary 
    Source="/RibbonControlsLibrary;component/Themes/Office2007Blue.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

<GridSplitter x:Name="gridSplitterTreeNodes" Width="10" 
       BorderThickness="1,0" Cursor="SizeWE" 
       RenderTransformOrigin="-1.2,0.507" ShowsPreview="True" 
       Style="{DynamicResource GridSplitterStyle1}"> 
    <GridSplitter.Background> 
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
     <GradientStop Color="#FFE3EFFF" Offset="0"/> 
     <GradientStop Color="#FFAFD2FF" Offset=".45"/> 
    </LinearGradientBrush> 
    </GridSplitter.Background> 
</GridSplitter> 
+0

Dando il codice di esempio ... non postare l'intero codice perché è troppo grande –

+1

Davvero non penso che gli elettori in basso dovrebbero sapere qualsiasi cosa al riguardo. Semplicemente non capiscono a causa della loro mancanza di conoscenza: p –

risposta

16
<GridSplitter x:Name="gridSplitterTreeNodes" Width="5" BorderThickness="1,0" 
    Cursor="SizeWE" RenderTransformOrigin="-1.2,0.507" ShowsPreview="True" 
    Style="{DynamicResource GridSplitterStyle1}"> 
    <GridSplitter.Background> 
    <ImageBrush ImageSource="Images\gripDots.png" TileMode="FlipXY" 
       Stretch="UniformToFill"/> 
    </GridSplitter.Background> 
</GridSplitter> 

È inoltre possibile salvare l'immagine da Msnd Microsoft per ottenere lo stesso effetto, More Info

+0

Non sono sicuro di quale "immagine" debba essere ... il collegamento dell'immagine interrotta punta a una pagina MSDN effettiva. So che questa è una vecchia risposta, ma sentiti libero di correggere il collegamento in ogni caso (con stack.imgur uploader?). –

29

Per lo più per il mio riferimento futuro, ecco un divisore griglia verticale che ha la forma arrotondata di un pulsante (ma non reagisce a mouseover correttamente):

<GridSplitter Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Center" Width="8"> 
    <GridSplitter.Template> 
     <ControlTemplate TargetType="{x:Type GridSplitter}"> 
      <Grid> 
       <Button Content="⁞" /> 
       <Rectangle Fill="#00FFFFFF" /> 
      </Grid> 
     </ControlTemplate> 
    </GridSplitter.Template> 
</GridSplitter> 

Uno splitter orizzontale potrebbe semplicemente utilizzare "····", come il contenuto del pulsante.

+0

Sembra facile e molto pulito! – Enrico

+1

Grazie per questo. Ho finito per usare "▌▌▌▌▌▌" come contenuto per uno splitter orizzontale, che IMHO sembra un po 'meglio di "····". –

1

Un altro modo per aggiungere un pulsante/elemento grafico "a pinza" a un GridSplitter, senza perdere gli eventi del mouse, consiste nell'utilizzare una semplice etichetta sopra lo splitter.

<GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch" Background="Gray"/> 

    <Label Grid.Column="1" Content="⁞" Foreground="White" VerticalAlignment="Center" FontSize="26" FontWeight="Bold" IsHitTestVisible="False"/> 

Assicurandosi che la GridSplitter ed etichetta sono nella stessa colonna, e che IsHitTestVisible = False si trova nel Label.