2010-07-19 9 views
2

Je souhaite contrôler la hauteur et la largeur d'une de mes fenêtres via mon ViewModel.wpf Fenêtre Largeur non contractuelle

Cela semble assez simple.

<Window ... Width="{Binding Path=Width}" Height="{Binding Path=Height}" /> 

mais non. ça ne marche pas.

Il vérifie Width du ViewModel mais pas le Height.

Étrangement, si je passe l'ordre de Width et Height dans le XAML il vérifie la Height et non la Width. C'est-à-dire qu'il vérifie uniquement la première des deux propriétés et ignore totalement la seconde.

Liaison les MaxHeight et MinHeight fonctionnent, même après le Width. Mais alors l'utilisateur ne peut pas redimensionner la fenêtre.

Répondre

0

J'ai aussi ce problème, ça a l'air d'un bug. Pour l'instant, je gère simplement l'événement DataContextChanged de la fenêtre et en définissant manuellement la largeur et la hauteur à partir du ViewModel.

+0

Merci - Ce commentaire semble être la seule idée qui fonctionne pour moi, mais je pense toujours que nous devrions être en mesure de changer un lien proprement et de voir le résultat reflété dans l'interface utilisateur. – Chris

2

Je ne sais pas ce que votre code ViewModel ressemble, mais essayez de créer un ensemble pour la largeur et Height et définir le mode de liaison à TwoWay

0

Ceci est correct par la conception (triste mais vrai). Le système de mise en page n'applique pas réellement ces valeurs, voir les remarques sur la page de documentation msdn pour Window.Height ... Dans certains cas, il est acceptable de définir MinWidth et MaxWidth (resp. * Height) pour obtenir un comportement similaire, mais pas toujours.

Désolé de ne pas avoir de meilleures nouvelles ...

+0

oh, et aussi voir [cette autre discussion] (http://stackoverflow.com/questions/4806088/wpf-finding-position-of-maximized-window/6525577#6525577) – eFloh

1

vous devriez avoir quelque chose comme ceci dans le cas de chargement de votre fenêtre:

public void AfterLoad() 
    { 
     this.Height = this.ViewModel.Settings.WindowHeight; 
     this.Width = this.ViewModel.Settings.WindowWidth; 

     if (this.ViewModel.Settings.WindowTop > 0 && this.ViewModel.Settings.WindowLeft > 0) 
     { 
      this.Top = this.ViewModel.Settings.WindowTop; 
      this.Left = this.ViewModel.Settings.WindowLeft; 
     } 
    } 

puis, gérer la taille de la fenêtre événement a changé de se rappeler la Largeur et hauteur et aussi la position changée pour se souvenir en haut, à gauche (si tu veux).

La liaison à WindowState fonctionne correctement.

+0

Correct. Ajoutez simplement "Default" comme dans Settings.Default.WindowHeight. – fab

0

Vous souhaitez lier à ActualHeight et à ActualWidth, et non à Height et Width.

Ainsi, au lieu de:

<Window ... Width="{Binding Path=Width}" Height="{Binding Path=Height}" /> 

Vous voulez:

<Window ... Width="{Binding Path=ActualWidth}" Height="{Binding Path=ActualHeight}" /> 
0

Je suppose que vous utilisez modèle MVVM avec les méthodes communes pour soulever de propertys changé du ViewModel à la vue, par une implémentation de l'interface INotifiyPropertyChanged dans votre ViewModel.

ne fonctionne pas:

WdwWidth = 600; 
WdwHeight = 600; 

RaisePropertyChanged("WdwWidth"); 
RaisePropertyChanged("WdwHeight"); 

travail:

WdwWidth = 600; 
RaisePropertyChanged("WdwWidth"); 

WdwHeight = 600; 
RaisePropertyChanged("WdwHeight"); 

Il me semble que la PropertysChanged notification doit être augmentée juste après la propriété a été réellement changé. Étrange, mais fait l'affaire pour moi.

Édition: Veillez à définir la liaison sur TwoWay, par ex. Height="{Binding Path=WdwHeight, Mode=TwoWay}"