窗口高度twoway绑定问题

时间:2014-04-21 06:35:44

标签: wpf binding window

下面是我的代码,

 public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private int myHeight = 0;

        public int MyHeight
        {
            get { return myHeight; }
            set
            {
                myHeight = value;
                OnPropertyChanged("MyHeight");
                MessageBox.Show("MainWindowHeight" + MyHeight);
            }
        }

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
        }
        private void OnPropertyChanged(string prop)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

<Window x:Class="Window_Sample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="{Binding MyHeight, Mode=TwoWay}" Width="525">

    <Grid>

    </Grid>
</Window>

当我将windowstate从最小化更改为最大化时,setter会被调用两次,这是第一次它具有正确的实际值,而在第二次调用中它具有值38,是否有任何对此行为的解释?还有为什么它被召唤两次?

谢谢, 库马尔

1 个答案:

答案 0 :(得分:4)

如果您查看调用堆栈两次访问该属性,您将看到第二个调用堆栈通过一个名为UpdateDimensionsToRestoreBounds的函数。对此进行网络搜索引领了我

http://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Window.cs#c8ff58cc4568752a

对此函数的评论表明,当窗口最大化或最小化时,意图是在未最大化或最小化时使属性保持值。看起来这是两个调用的原因,第二个是设置未最大化或最小化时的值。

如果您想知道窗口的高度,可以使用

double renderedHeight = Application.Current.MainWindow.ActualHeight;

希望这有帮助