wpf - 扩展器的头部适合内容宽度?

时间:2015-12-18 11:40:32

标签: c# wpf

有没有办法让Header的{​​{1}}适合WPF中可调整大小的窗口中的最大宽度?似乎无论我做什么,我都无法将内容扩展到最大宽度。它适用于Expander的{​​{1}}部分。

enter image description here

Content

2 个答案:

答案 0 :(得分:3)

最快的方法是将标题的宽度绑定到整个扩展器的宽度。

<Expander IsExpanded="True">
  <Expander.Header>
      <Grid Width="{Binding RelativeSource={RelativeSource
            Mode=FindAncestor,
            AncestorType={x:Type Expander}},
            Path=ActualWidth}"
            Height="50">
            <Rectangle Fill="Red"></Rectangle>
      </Grid>
  </Expander.Header>
  <Rectangle Fill="Red"></Rectangle>
</Expander>

但它不是一个精确的方法,因为你的箭头也需要一些空间,你可以看到标题比你需要的要宽一些。 Changed width for expander's header

您可以覆盖扩展程序标头的标准模板(HeaderTemplate)。

<强>更新

我找到了一个使用the code-behind file的可能解决方案(所有信用都转到@kmatyaszek)。

添加帮助器类以查找更改宽度所需的控件。它检查父控件的整个Visual Tree,并返回我们正在寻找的类型的子项。

public static class VTHelper
{
    public static T FindChild<T>(DependencyObject parent) where T : DependencyObject
    {
        if (parent == null) return null;

        T childElement = null; 
        int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 
        for (int i = 0; i < childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            T childType = child as T; 
            if (childType == null)
            {
                childElement = FindChild<T>(child); 
                if (childElement != null) 
                    break;
            }
            else
            {
                childElement = (T)child; 
                break;
            }
        } 
        return childElement;
    }
}

添加处理程序以处理加载事件。它会更改HorizontalAlignment实例的ContentPresenter属性:

private void expander_Loaded(object sender, RoutedEventArgs e)
{
    var tmp = VTHelper.FindChild<ContentPresenter>(sender as Expander);
    if (tmp != null)
    {
        tmp.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
    }
}

将此处理程序附加到扩展器:

<Expander IsExpanded="True" Loaded="expander_Loaded">

这种方法使用代码隐藏,但它不适用于任何数据(或ViewModel)。它仅改变控件的视觉外观。

答案 1 :(得分:0)

        <Expander Name="myexpander" IsExpanded="True" Margin="0,0,1,0">
            <Expander.Header>
                <Grid Width="{Binding ElementName=myexpander, Path=ActualWidth}" Height="50">
                    <Rectangle Fill="Red"></Rectangle>
                </Grid>
            </Expander.Header>

            <Rectangle Fill="Red"></Rectangle>

        </Expander>

    </Grid>

为扩展器命名并绑定width属性