Question

Je veux avoir un texte dans un en-tête d'extension aligné à gauche, puis un droit de texte aligné. J'ai trouvé comment élargir l'en-tête à la largeur du conteneur, et pensé que je pourrais simplement ajouter un DockPanel et régler le deuxième bloc de texte Dock droit, mais il ne semble pas aider. Toute solution?

<Expander>
  <Expander.Header>
    <DockPanel
      Width="{Binding
        RelativeSource={RelativeSource
        Mode=FindAncestor,
        AncestorType={x:Type Expander}},
        Path=ActualWidth}">
      <TextBlock
        Text="I am header text…"
        Background="LightBlue"
      />
      <TextBlock DockPanel.Dock="Right"
        Text="I am header text…"
        Background="Yellow"
      />
    </DockPanel>
  </Expander.Header>
</Expander>
Était-ce utile?

La solution

Définissez la propriété TextAlignment à droite et la propriété HorizontalAlignment à étirer sur les TextBlocks. Cela devrait aider je pense.

Si votre utilisation de la couleur est autre chose que des fins de démonstration et que vous voulez littéralement à droite tout l'élément aligné alors vous pourriez vouloir regarder définir la propriété LastChildFill du DockPanel false.

Autres conseils

est ce qui a fonctionné pour moi. Cela déplace également la flèche vers la droite, car il est de revenir l'ordre de l'en-tête et re-revenir l'ordre pour le contenu.

<Expander FlowDirection="RightToLeft" >  
  <Expander.Header>
    <DockPanel FlowDirection="LeftToRight" 
          HorizontalAlignment="{Binding HorizontalAlignment,
                          RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}},
                          Mode=OneWayToSource}"
          LastChildFill="True">
      <!-- Change the look inside header here -->

      <Label Content="Header" Background="Red" />
    </DockPanel>
  </Expander.Header>

  <Expander.Content>
    <!-- Change the look inside content here, by default Expander.Content is stretched -->
    <DockPanel FlowDirection="LeftToRight" LastChildFill="True">
      <Label Content="Left" Background="Aquamarine" />
      <Label Content="Fill" Background="Plum" />
    </DockPanel>
  </Expander.Content>
</Expander>

( Source )

Malheureusement, cela a à voir avec un problème avec le modèle d'extension par défaut, qui définit l'alignement horizontal de l'en-tête à gauche au lieu d'étirement. La meilleure façon de le faire fonctionner serait de créer un nouveau modèle qui définit cela correctement. Voici un lien pour plus d'informations:

http://silverlight.net/forums/p/57142/145801 .aspx # 145801

il est pour silverlight, mais applique à WPF aussi bien. Une autre façon de le faire serait de lier la largeur de votre DockPanel ci-dessus à la largeur réelle de l'élément contenant le détendeur. Ce n'est pas une bonne solution, mais cela fonctionne. Vous devrez créer un convertisseur de valeur pour la largeur. Voici un code:

[ValueConversion(typeof(double), typeof(double))]
public class OffsetDoubleConverter : IValueConverter
{
    #region IValueConverter Members

    public double Offset { get; set; }
    public bool KeepPositive { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double number = (double)value + Offset;
        if ((KeepPositive) && (number < 0.0))
        {
            number = 0.0;
        }
        return number;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double number = (double)value - Offset;
        if ((KeepPositive) && (number < 0.0))
        {
            number = 0.0;
        }
        return number;
    }

    #endregion
}

Et dans votre XAML:

<!-- create a ref to your namespace -->
xmlns:loc="clr-namespace:YourNamespace"

...

<Window.Resources>
<loc:OffsetDoubleConverter x:Key="ExpanderConverter" Offset="-208.0" KeepPositive="True"/>
</Window.Resources>

...

<DockPanel Width="{Binding ElementName=ADifferentElement, Path=ActualWidth,
                   Converter={StaticResource ExpanderConverter}}">
...

Encore une fois, ce n'est pas la meilleure solution, mais il devrait fonctionner. Une chose à noter, si vous définissez la valeur de décalage trop petit et le lier à un parent de votre extension, vous pouvez obtenir visual studio pour accrocher depuis le ActualWidth du parent reposerait sur votre largeur de l'extension.

Faites-moi savoir si cette mise en œuvre n'est pas tout à fait clair. Encore une fois, je recommande vraiment juste en utilisant un modèle personnalisé pour l'extension. Vous pouvez obtenir le modèle par défaut et juste modifier légèrement pour le faire fonctionner. Je peux signaler que aussi bien si vous le souhaitez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top