有什么方法可以使WPF 中可调整大小的窗口中Header的ExpanderFit 成为最大宽度?看来无论我做什么,我都无法将内容扩展到最大宽度。它Content在Expander.
<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)
最快的方法是将 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)
添加一个处理程序来处理加载事件。它改变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;
}
}
Run Code Online (Sandbox Code Playgroud)
将此处理程序附加到扩展器:
<Expander IsExpanded="True" Loaded="expander_Loaded">
Run Code Online (Sandbox Code Playgroud)
这种方法使用代码隐藏,但它不适用于任何数据(或 ViewModel)。它仅更改控件的视觉外观。
| 归档时间: |
|
| 查看次数: |
1610 次 |
| 最近记录: |