Привязка объявлена ​​в xaml не работает

У меня есть главное окно, которое содержит сетку, во время события загрузки окна я буду динамически создавать экземпляр пользовательского элемента управления и добавлять его в сетку. Чтобы позволить пользовательскому элементу управления адаптироваться при изменении размера главного окна, я хочу привязать ширину и высоту пользовательского элемента управления к сетке. ActualWidth а также ActualHeight,

Первый способ - создать объект привязки в коде, в том же месте события window_loaded,

Binding widthBinding = new Binding("ActualWidth");
widthBinding.Source = panel;
BindingOperations.SetBinding(uc, WidthProperty, widthBinding);

Binding heightBinding = new Binding("ActualHeight");
heightBinding.Source = panel;
BindingOperations.SetBinding(uc, HeightProperty, heightBinding);

panel.Children.Add(uc);

это работало как ожидалось.

Второй способ - использовать привязку xaml в файле xaml пользовательского элемента управления,

<UserControl x:Class="S2T.RAHS2.ContentAcquisition.FileViewer.WordViewer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Loaded="UserControl_Loaded" Unloaded="UserControl_Unloaded" 
    Width="{Binding ElementName=ContainerElement, Path=ActualWidth}"
    Height="{Binding ElementName=ContainerElement, Path=ActualHeight}">

или же

 <UserControl x:Class="S2T.RAHS2.ContentAcquisition.FileViewer.WordViewer"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Loaded="UserControl_Loaded" Unloaded="UserControl_Unloaded" 
        Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}, AncestorLevel=1}, Path=ActualWidth}"
        Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}, AncestorLevel=1}, Path=ActualHeight}">

Но это не сработало.

Могу ли я знать, что не так с подходом xaml?

1 ответ

Можете ли вы попробовать использовать выравнивания вместо привязки?

<UserControl x:Class="S2T.RAHS2.ContentAcquisition.FileViewer.WordViewer"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Loaded="UserControl_Loaded" Unloaded="UserControl_Unloaded" 
        HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>

Проблема с привязкой заключается в том, что ActualHeight а также ActualWidth может увеличиться, если что-то на панели заставит это увеличиться. Это особенно верно с StackPanels.

Если вы прибываете, используя Grid, это может работать с привязкой к родителю ActualWidth а также ActualHeight, Я обнаружил, что иногда это работает, но часто что-то в панели увеличивает размер и портит привязку.

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