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.CaptionHeightHeaderPanel.Height 使用固定高度,但我更喜欢绑定到精确高度。

ActualHeight 不是 DependencyPropertyINotifyPropertyChanged,因此您不能直接绑定到它并期望不止一次读取。您可以在样式上设置触发器。

解决方法包括:

  • 在您的 class(视图侧)中创建 属性,它是 DependencyPropertyINotifyPropertyChanged 属性。
  • 正在为您想了解 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 变量...