2009-12-11 10 views
0

J'ai une fenêtre principale qui contient une grille, lors de l'événement chargé de la fenêtre, je vais créer dynamiquement une instance d'un contrôle utilisateur et l'ajouter à la grille. Afin de permettre à l'utilisateur de contrôler lui-même quand la fenêtre principale est redimensionnée, je veux lier la largeur et la hauteur du contrôle utilisateur à ActualWidth et ActualHeight de la grille.liaison déclarée dans xaml ne fonctionne pas

La première est de créer l'objet de liaison dans le code, même dans le cas 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); 

cela a fonctionné comme prévu.

La deuxième façon est d'utiliser XAML obligatoire dans le fichier XAML du contrôle utilisateur,

<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}"> 

ou

<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}"> 

Mais cela ne fonctionne pas. Puis-je savoir ce qui ne va pas avec l'approche xaml?

+0

Pouvez-vous publier les erreurs de liaison de la fenêtre de sortie pour les deux scénarios XAML que vous avez publiés. Vous pouvez également publier le code XAML pour la grille à laquelle vous ajoutez ce UserControl. La grille est-elle le parent immédiat de ce UserControl? –

+0

J'ai créé un nouveau test, et maintenant tout fonctionne. Si j'utilise une grille comme parent du contrôle utilisateur, je n'ai pas besoin d'insérer de liaison. Si j'utilise un panneau de pile, les deux liaisons xmal ci-dessus sont efficaces. Ce que je ne comprends pas, c'est pourquoi le test précédent n'a pas fonctionné, puisque j'ai beaucoup changé dans l'ancien projet de test, je n'ai pas pu récupérer le code précédent. – intangible02

Répondre

0

Pouvez-vous essayer d'utiliser les alignements au lieu de la liaison?

<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"/> 

Le problème avec la liaison est que le ActualHeight et ActualWidth pourrait augmenter si quelque chose dans le panneau permet d'augmenter. Cela est particulièrement vrai avec StackPanel s. Si vous utilisez un Grid, il peut fonctionner avec la liaison au parent ActualWidth et ActualHeight. J'ai trouvé que parfois cela fonctionne, mais souvent quelque chose dans le panneau fait augmenter la taille et gâche la liaison.

+0

Salut Andrew, HorizontalAlignment et VerticalAlignment sont configurés pour s'étirer. – intangible02

Questions connexes