WPF/XAML - привязка WindowChrome.CaptionHeight
Тема /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>
Я хотел бы связать ActualHeight
свойство элемента HeaderPanel внутри ControlTemplate
, Является ли это возможным?
Другое решение - использовать фиксированную высоту для WindowChrome.CaptionHeight
а также HeaderPanel.Height
, но я предпочитаю привязку к точной высоте.
2 ответа
ActualHeight
это не DependencyProperty
или INotifyPropertyChanged
Таким образом, вы не можете напрямую связываться с ним и ожидать большего, чем одноразовое чтение. Вы можете установить триггер на него в стиле.
Обход включает в себя:
- Создание свойства в вашем классе (вид сбоку), которое либо
DependencyProperty
илиINotifyPropertyChanged
имущество. - Регистрация для
SizeChanged
событие на элементе, который вы хотите знатьAbsoluteHeight
на. - В обработчике события обновите созданное вами свойство.
Более сложная реализация будет использовать присоединенные свойства зависимостей, которые по сути делают то же самое, но они будут иметь более общее назначение.
В 2021 году моим решением без привязки было присвоить Ax:Name WindowChrome и изменить значение CaptionHeigth в событии Window_SizeChanged:
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
SessionWindowChrome.CaptionHeight = ActualHeight - SessionWindowChrome.ResizeBorderThickness.Top - SessionWindowChrome.ResizeBorderThickness.Bottom;
}
Учтите, что я тоже использую переменные ResizeBorderThickness...