Выравнивание по правому краю элементов в заголовке экспандера wpf - PullRequest
2 голосов
/ 08 апреля 2009

Я хочу, чтобы текст в заголовке расширителя был выровнен по левому краю, а затем текст по правому краю. Я нашел, как расширить заголовок до ширины контейнера, и подумал, что я мог бы просто добавить док-панель и установить для второго текстового блока значение Dock Right, но это, похоже, не помогает. Любые решения?

<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>

Ответы [ 3 ]

3 голосов
/ 27 июня 2013

Вот что у меня сработало. Это также перемещает стрелку вправо, потому что это изменяет порядок заголовка и восстанавливает порядок содержимого.

<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>

( Источник )

1 голос
/ 08 апреля 2009

К сожалению, это связано с проблемой шаблона расширения по умолчанию, который устанавливает горизонтальное выравнивание заголовка по левому краю вместо растяжения. Лучший способ заставить его работать - это создать новый шаблон, который устанавливает это правильно. Вот ссылка для получения дополнительной информации:

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

Это для Silverlight, но также относится и к WPF. Другой способ сделать это - привязать ширину панели док-станции выше к фактической ширине элемента, содержащего расширитель. Это не очень хорошее решение, но оно работает. Вам нужно будет создать конвертер значений для ширины. Вот некоторый код:

[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
}

А в вашем 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}}">
...

Опять же, это не лучшее решение, но оно должно работать. Стоит отметить, что если вы установите слишком низкое значение смещения и привязаете его к родительскому элементу вашего расширителя, вы можете заставить Visual Studio зависать, поскольку фактическая ширина родительского элемента будет зависеть от вашей ширины расширителя.

Дайте мне знать, если эта реализация не совсем понятна. Опять же, я бы очень рекомендовал использовать собственный шаблон для расширителя. Вы можете получить шаблон по умолчанию и просто немного изменить его, чтобы он работал. Я могу опубликовать это, если хотите.

1 голос
/ 08 апреля 2009

Попробуйте установить свойство TextAlignment вправо, а свойство HorizontalAlignment растянуть на TextBlock s. Это должно помочь, я думаю.

Если вы используете цвет для чего-то иного, чем демонстрационные цели, и вы буквально хотите, чтобы весь элемент был выровнен по правому краю, тогда вам может потребоваться установить для свойства LastChildFill DockPanel значение false.

...