WPF/XAML – WindowChrome.CaptionHeight 的绑定
WPF/XAML – Binding of WindowChrome.CaptionHeight
Theme/Generic.xaml 我的 WPF 自定义控件 MyBaseWindow 看起来像这样:
<Style TargetType="{x:Type MyBaseWindowPath:MyBaseWindow}">
…
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome CaptionHeight="{Binding ActualHeight, ElementName=HeaderPanel}"
GlassFrameThickness="0"
CornerRadius="0" />
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MyBaseWindowPath:MyBaseWindow}">
…
<DockPanel x:Name="HeaderPanel">
…
</DockPanel>
…
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我想在 ControlTemplate
中绑定 HeaderPanel 元素 的 ActualHeight
属性。可能吗?
另一种解决方案是为 WindowChrome.CaptionHeight
和 HeaderPanel.Height
使用固定高度,但我更喜欢绑定到精确高度。
ActualHeight
不是 DependencyProperty
或 INotifyPropertyChanged
,因此您不能直接绑定到它并期望不止一次读取。您可以在样式上设置触发器。
解决方法包括:
- 在您的 class(视图侧)中创建 属性,它是
DependencyProperty
或 INotifyPropertyChanged
属性。
- 正在为您想了解
AbsoluteHeight
的元素注册 SizeChanged
事件。
- 在事件的处理程序中,更新您创建的 属性。
更高级的实现会使用附加的依赖属性,这些属性本质上做同样的事情,但它们会更通用一些。
2021 年,我没有绑定的解决方案是将 x:Name 分配给 WindowChrome 并更改 Window_SizeChanged
事件中的 CaptionHeight
值:
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
SessionWindowChrome.CaptionHeight = ActualHeight
- SessionWindowChrome.ResizeBorderThickness.Top
- SessionWindowChrome.ResizeBorderThickness.Bottom;
}
考虑到我也使用 ResizeBorderThickness
变量...
Theme/Generic.xaml 我的 WPF 自定义控件 MyBaseWindow 看起来像这样:
<Style TargetType="{x:Type MyBaseWindowPath:MyBaseWindow}">
…
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome CaptionHeight="{Binding ActualHeight, ElementName=HeaderPanel}"
GlassFrameThickness="0"
CornerRadius="0" />
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MyBaseWindowPath:MyBaseWindow}">
…
<DockPanel x:Name="HeaderPanel">
…
</DockPanel>
…
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我想在 ControlTemplate
中绑定 HeaderPanel 元素 的 ActualHeight
属性。可能吗?
另一种解决方案是为 WindowChrome.CaptionHeight
和 HeaderPanel.Height
使用固定高度,但我更喜欢绑定到精确高度。
ActualHeight
不是 DependencyProperty
或 INotifyPropertyChanged
,因此您不能直接绑定到它并期望不止一次读取。您可以在样式上设置触发器。
解决方法包括:
- 在您的 class(视图侧)中创建 属性,它是
DependencyProperty
或INotifyPropertyChanged
属性。 - 正在为您想了解
AbsoluteHeight
的元素注册SizeChanged
事件。 - 在事件的处理程序中,更新您创建的 属性。
更高级的实现会使用附加的依赖属性,这些属性本质上做同样的事情,但它们会更通用一些。
2021 年,我没有绑定的解决方案是将 x:Name 分配给 WindowChrome 并更改 Window_SizeChanged
事件中的 CaptionHeight
值:
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
SessionWindowChrome.CaptionHeight = ActualHeight
- SessionWindowChrome.ResizeBorderThickness.Top
- SessionWindowChrome.ResizeBorderThickness.Bottom;
}
考虑到我也使用 ResizeBorderThickness
变量...