wpf - 扩展器的标题适合内容宽度吗?

Jok*_*ini 1 c# wpf

有什么方法可以使WPF 中可调整大小的窗口中HeaderExpanderFit 成为最大宽度?看来无论我做什么,我都无法将内容扩展到最大宽度。它ContentExpander.

在此处输入图片说明

<Grid Background="LightGray">

    <Expander IsExpanded="True">
         <Expander.Header>
              <Grid Width="100" Height="50">
                   <Rectangle Fill="Red"></Rectangle>
              </Grid>
         </Expander.Header>

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

    </Expander>

</Grid>
Run Code Online (Sandbox Code Playgroud)

Ser*_*hyk 6

最快的方法是将 header 的宽度绑定到整个 expander 的宽度。

<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>
Run Code Online (Sandbox Code Playgroud)

但这不是一种精确的方法,因为您的箭头也占用了一些空间,并且您可以看到标题比您需要的要宽一些。 更改扩展器标题的宽度

您可以覆盖HeaderTemplate扩展器标题的标准模板 ( )。

更新

我使用代码隐藏文件找到了一个可能的解决方案(所有功劳归于@kmatyaszek)。

添加一个辅助类来查找我们需要更改宽度的控件。它检查父控件的整个可视化树并返回我们正在寻找的类型的子控件。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

添加一个处理程序来处理加载事件。它改变HorizontalAlignmentContentPresenter实例的属性:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<Expander IsExpanded="True" Loaded="expander_Loaded">
Run Code Online (Sandbox Code Playgroud)

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