199 votes

Comment dois-je espacer les éléments enfants d'un StackPanel?

Étant donné un StackPanel:

<StackPanel>
  <TextBox Height="30">Apple</TextBox>
  <TextBox Height="80">Banana</TextBox>
  <TextBox Height="120">Cherry</TextBox>
</StackPanel>

Quel est le meilleur moyen d'espacer les éléments enfants de sorte qu'il y a aussi de la taille des espaces entre elles, même si l'enfant les éléments eux-mêmes sont de tailles différentes? Peut-il être fait sans l'aide des propriétés de chacun des enfants?

300voto

Sergey Aldoukhov Points 8386

L'utilisation de la Marge ou du Rembourrage, appliquée à la portée à l'intérieur du conteneur:

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Margin" Value="0,10,0,0"/>
        </Style>
    </StackPanel.Resources> 
    <TextBox Text="Apple"/>
    <TextBox Text="Banana"/>
    <TextBox Text="Cherry"/>
</StackPanel>

EDIT: Dans le cas où vous souhaitez ré-utiliser la marge entre les deux récipients, vous pouvez convertir la valeur de la marge à une ressource à l'extérieur de son champ d'application, f.e.

<Window.Resources>
    <Thickness x:Key="tbMargin">0,10,0,0</Thickness>
</Window.Resources>

et puis reportez-vous à cette valeur dans l'intérieur de la portée

<StackPanel.Resources>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="Margin" Value="{StaticResource tbMargin}"/>
    </Style>
</StackPanel.Resources>

90voto

Elad Katz Points 4105

Une autre belle approche peut être vu ici: http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between-items-in-stackpanel.aspx

Il montre comment créer un comportement attaché à un, de sorte que la syntaxe de ce genre:

<StackPanel local:MarginSetter.Margin="5">
   <TextBox Text="hello" />
   <Button Content="hello" />
   <Button Content="hello" />
</StackPanel>

C'est la méthode la plus simple et la plus rapide façon de définir la Marge de plusieurs enfants d'un groupe spécial, même si elles ne sont pas du même type. (I. e. Boutons, zones de texte, zones de liste modifiables, etc.)

6voto

Andre Luus Points 1603

+1 pour Sergey réponse. Et si vous souhaitez appliquer qu'à tous vos StackPanels vous pouvez faire ceci:

<Style TargetType="{x:Type StackPanel}">
    <Style.Resources>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Margin" Value="{StaticResource tbMargin}"/>
        </Style>
    </Style.Resources>
</Style>

Mais attention: si vous définissez un style de ce genre dans votre Application.xaml (ou un autre dictionnaire qui est fusionné dans l'Application.Ressources), il peut remplacer le style par défaut de la commande. Pour la plupart des lookless contrôles comme le stackpanel il n'est pas un problème, mais pour les zones de texte, etc vous pouvez tomber sur ce problème, qui, heureusement, a quelques solutions de contournement.

3voto

George Birbilis Points 321

Suite à Sergey suggestion, vous pouvez définir et réutiliser un ensemble de Style (avec divers accesseurs de propriété, y compris la Marge) au lieu de juste l'Épaisseur de l'objet:

<Style x:Key="MyStyle" TargetType="SomeItemType">
  <Setter Property="Margin" Value="0,5,0,5" />
  ...
</Style>

...

  <StackPanel>
    <StackPanel.Resources>
      <Style TargetType="SomeItemType" BasedOn="{StaticResource MyStyle}" />
    </StackPanel.Resources>
  ...
  </StackPanel>

Notez que l'astuce ici est l'utilisation de l'Héritage des styles pour le style implicite, l'héritage du style dans certains extérieur (probablement fusionné externes dans le fichier XAML) dictionnaire de ressources.

Sidenote:

Au début, j'ai naïvement essayé d'utiliser le style implicite de définir le Style de la propriété du contrôle pour que l'extérieur de Style ressource (disons défini avec la touche "MyStyle"):

<StackPanel>
  <StackPanel.Resources>
    <Style TargetType="SomeItemType">
      <Setter Property="Style" Value={StaticResource MyStyle}" />
    </Style>
  </StackPanel.Resources>
</StackPanel>

qui a causé Visual Studio 2010 pour arrêter immédiatement avec de l'ÉCHEC CATASTROPHIQUE erreur (HRESULT: 0x8000FFFF (E_UNEXPECTED)), comme décrit au https://connect.microsoft.com/VisualStudio/feedback/details/753211/xaml-editor-window-fails-with-catastrophic-failure-when-a-style-tries-to-set-style-property#

2voto

Jean Azzopardi Points 1575

Le UniformGrid peuvent ne pas être disponibles dans Silverlight, mais quelqu'un l'a porté à partir de WPF. http://www.jeff.wilcox.name/2009/01/uniform-grid/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X