右对齐wpf扩展器标头中的项目

时间:2009-04-08 09:15:56

标签: wpf expander

我想在扩展器标题中左对齐一些文本,然后将一些文本右对齐。 我已经找到了如何将标题扩展到容器的宽度,并认为我可以简单地添加一个dockpanel并将第二个文本块设置为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 个答案:

答案 0 :(得分:3)

这对我有用。这也会将箭头向右移动,因为它会恢复标题的顺序并重新恢复内容的顺序。

<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

答案 1 :(得分:1)

尝试将TextAlignment属性设置为右,将HorizontalAlignment属性设置为TextBlock。这应该有助于我思考。

如果您使用颜色是出于演示目的以外的其他内容并且您确实希望整个元素正确对齐,那么您可能希望将LastChildFill的{​​{1}}属性设置为false

答案 2 :(得分:1)

不幸的是,这与默认扩展器模板的问题有关,该模板将标头的水平对齐设置为left而不是stretch。让它工作的最好方法是创建一个正确设置它的新模板。这是一个更多信息的链接:

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

它适用于silverlight,但也适用于wpf。另一种方法是将上面的dockpanel宽度绑定到包含扩展器的元素的实际宽度。这不是一个很好的解决方案,但它有效。您需要为宽度创建一个值转换器。这是一些代码:

[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挂起,因为父级的实际宽度将基于扩展器的宽度。

如果此实施不太清楚,请告诉我。同样,我真的建议只为扩展器使用自定义模板。您可以获取默认模板,只需稍加修改即可使其正常工作。如果你愿意,我也可以发布。