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...

Другие вопросы по тегам