2010-03-14 14 views
4

Est-il possible d'augmenter la distance d'un séparateur de réseau à partir duquel l'utilisateur peut l'attraper?Augmenter le seuil de saisie de la souris GridSplitter de WPF

Mon séparateur n'a qu'une largeur de 1px. J'aimerais pouvoir attraper le séparateur d'une plus grande distance.

Comme c'est maintenant je dois pointer la souris sur la ligne 1px exacte pour l'attraper.

Et le séparateur doit encore être 1px de largeur

Répondre

13

Vous pouvez modifier la taille réelle du GridSplitter tout en gardant son aspect comme il est plus petit. Cela vous donnera une largeur de la zone de pixel 7 à saisir tout en montrant à 1 pixel:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition Width="1"/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <GridSplitter Grid.Column="1" 
        Margin="-3,0" 
        BorderThickness="3,0" 
        BorderBrush="Transparent" 
        HorizontalAlignment="Stretch" /> 
</Grid> 

L'exemple utilise la méthode de donner le séparateur sa propre colonne, mais le même principe si elle est à gauche ou à droite aligné dans une colonne partagée.

+3

C'est correct, mais j'ai dû changer le ZIndex du gridsplitter, parce que le côté droit a été caché par un DockPanel. – ErikTJ

+0

Quel est le but de Margin = "- 3,0"? Vous voulez que le séparateur horizontal aligné à gauche dans la zone de 7 pixels au lieu de centré? –

+0

Les marges négatives créent l'espace supplémentaire de chaque côté pour la bordure transparente de 3 px pour remplir la mise en page. Sans cela, le séparateur n'a que la colonne 1 px à afficher. –

2

Je n'ai pas réussi à faire fonctionner la solution de John Bowen. On aurait dit que ça fonctionnait, mais il semblait que le séparateur n'avait qu'un pixel d'espace de saisie.

Je fini par faire ceci:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <Stackpanel Grid.Row="0"/> 
    <GridSplitter 
     Grid.Row="1" 
     HorizontalAlignment="Stretch" 
     BorderBrush="DarkGray" 
     Height="6" 
     Background="Transparent" 
     BorderThickness="0,1,0,0" 
     Margin="0,0,0,-4"/> 
    <Stackpanel Grid.Row="2"/> 
</Grid> 

Cela donne le séparateur 6 pixels de hauteur, mais montre que la ligne de bordure supérieure de 1 pixel. Vous utilisez une marge inférieure négative de ((Hauteur/2) - 1) afin de centrer cette ligne de marge supérieure au milieu de la rangée. L'arrière-plan est transparent sinon vous verrez 6 pixels de gris ou w/e la couleur par défaut est. Si vous creusez dans le modèle de contrôle de GridSplitter avec Blend, vous découvrirez qu'il s'agit simplement d'un Rectangle de style avec une bordure ou quelque chose comme ça.

+0

Le problème avec cette technique est qu'il met la ligne grise en haut de la zone de 6 pixels où vous pouvez saisir la ligne grise. Etes-vous sûr que vous n'avez pas simplement oublié de retourner certaines valeurs dans votre traduction de la réponse de John de verticale à horizontale? Cela a fonctionné pour moi (zone de 5 pixels à saisir, ligne grise au centre de la zone): ' ' –