【问题标题】:Window Height twoway Binding issue窗口高度双向绑定问题
【发布时间】:2014-04-21 06:35:44
【问题描述】:

下面是我的代码,

 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>

当我将窗口状态从最小化更改为最大化时,setter 被调用了两次,第一次它具有正确的实际值,而在第二次调用中它的值是 38,对这种行为有什么解释吗?还有为什么它会被调用两次?

谢谢, 库马尔

【问题讨论】:

    标签: wpf binding window


    【解决方案1】:

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

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

    关于这个函数的注释说,当窗口最大化或最小化时,目的是让属性在未最大化或最小化时保持该值。看起来这是两个调用的原因,第二个是设置它们在不最大化或最小化时的值。

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

    double renderedHeight = Application.Current.MainWindow.ActualHeight;
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      相关资源
      最近更新 更多