Выровнять элементы по правому краю в заголовке расширителя wpf

StackOverflow https://stackoverflow.com/questions/729200

  •  05-09-2019
  •  | 
  •  

Вопрос

Я хочу, чтобы некоторый текст в заголовке расширителя был выровнен по левому краю, а затем по правому краю.Я нашел, как расширить заголовок до ширины контейнера, и подумал, что могу просто добавить док-панель и установить для второго текстового блока значение 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>
Это было полезно?

Решение

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

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

Другие советы

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

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

(Источник)

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

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 зависнуть, поскольку фактическая ширина родительского элемента будет зависеть от ширины вашего расширителя.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top