2009-12-11 7 views
0

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

Первый способ заключается в создании привязки объекта в коде, то же место в 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?

+0

Можете ли вы опубликовать ошибки привязки выходного окна для двух сценариев XAML, которые вы опубликовали. Также вы можете разместить XAML для сетки, к которой вы добавляете этот UserControl. Является ли сетка непосредственным родителем этого UserControl? –

+0

Я создал новый тест, и теперь все работает. Если я использую сетку как родительский элемент пользовательского элемента управления, мне не нужно вставлять привязки. Если я использую стекную панель, эти два сочетания xmal являются эффективными. Я не понимаю, почему предыдущий тест не работал, так как я сильно изменился в старом тестовом проекте, я не смог восстановить предыдущий код. – intangible02

ответ

0

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

<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 может увеличиться, если что-то в панели позволяет увеличить. Это особенно верно в отношении StackPanel.

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

+0

Привет, Андрей, оба HorizonalAlignment и VerticalAlignment настроены на растяжение. – intangible02

 Смежные вопросы

  • Нет связанных вопросов^_^