2017-10-18 22 views
1

UWP a un problème de conception: ActualHeight/ActualWidth, qui stocke le résultat des opérations de mise en page, sont toujours un nombre réel. Cependant, parce qu'ils sont mis à jour si fréquemment, UWP ne notifie pas quand ils changent. Height/Width fournit des notifications de modification, mais peut souvent être NaN, comme lorsque l'objet est défini pour s'étirer pour remplir un parent.Quelle est la bonne façon de lier à la taille (largeur/hauteur) d'un autre élément dans UWP?

Il semble que la réponse est: Ne pas. Abonnez-vous à SizeChanged et ajustez directement les propriétés qui dépendent de la taille, en utilisant ActualHeight et ActualWidth. Cependant, je rencontre un autre problème avec ce dernier, où tous les contrôles enfants ne se redessinent pas correctement, et il semble que ce soit parce que l'événement SizeChanged est parfois supprimé et que certains contrôles enfants restent bloqués avec une ancienne valeur de taille. Ce problème devient plus sensible avec le redimensionnement rapide. Un petit redimensionnement lent les oblige à redessiner correctement. Je suppose que pour la performance, le framework de rendu UWP essaie de réduire la quantité de travail qui se passe pendant le dessin.

Quelle est la bonne façon de procéder? Et/ou si je continue à utiliser SizeChanged, comment puis-je m'assurer que les valeurs finales sont rendues, ou que le travail effectué est réduit de sorte que tous les événements SizeChanged sont reçus?

(w/Win10 16299 SDK)

UPDATE: La mauvaise conduite de SizeChanged était en partie due à ma misordering de la logique de gestionnaire d'événements. Cependant, il existe des cadres de seuil dans lesquels les objets qui doivent être positionnés de manière identique sont mal alignés. En regardant plus loin, cela semble être un bug dans le positionnement de la grille.

Répondre

1

Supposons que vous ayez 2 éléments: un TextBox et un ComboBox. Vous voulez à chaque fois que la taille de la zone de texte change, la taille de la zone de liste déroulante doit également être modifiée. Voir this.

<TextBox Name="TextBox1"></TextBox> 
<ComboBox Width={Binding ElementName=TextBox1 Path=Width} 
      Height={Binding ElementName=TextBox1 Path=Height}><ComboBox/> 

Si vous souhaitez lier dans le fichier cs. Vous pouvez le faire:

TextBox TextBox1=new TextBox(); 
    Binding WidthBinding=new Binding(); 
    WidthBinding.Source=ViewModelClass; 
    WidthBinding.Path=new PropertyPath("WidthPropertyInViewModelClass"); 
    WidthBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
    BindingOperations.SetBinding(TextBox1, TextBox.WidthProperty, WidthBinding); 

Pour plus d'informations sur la liaison dans le fichier de code, voir this et this

+0

Je comprends que, bien que mes besoins sont un peu plus complexe. J'ai des objets dynamiquement ajoutés dans le code, et je les positionne proportionnellement via un ValueConverter avec un paramètre. Et quand l'objet est autosized, comme je l'ai dit, Height et Width sont NaN indépendamment de la taille de l'élément. –

+0

@NickBauer 'Width' et' Height' seront toujours 'NaN' si vous ne les avez jamais définis. Vous pouvez utiliser 'ActualWidth' et' ActualHeight' ou 'RenderSize' - ces propriétés sont initialisées après l'événement' SizeChanged'. Et essayez d'utiliser 'x: Bind' - c'est plus rapide et a plus de fonctionnalités. –

+0

@NickBauer J'ai mis à jour la réponse, j'espère pouvoir vous aider. –