如果Topmost属性已更改,则获取信息

时间:2011-09-23 14:02:49

标签: c# wpf topmost

我有一个派生自Window的类,我想在Topmost属性发生变化时收到通知。

我试图覆盖setter,但它没有标记为虚拟。更改与此属性关联的元数据使其无法工作(设置topmost true后没有任何反应)。 WPF也不提供与此属性相关的事件。我正在考虑覆盖Topmost属性,但我将它用于数据绑定,因此它必须保留DependencyProperty。

有没有办法收到通知?

3 个答案:

答案 0 :(得分:2)

我试试这个似乎对我来说很好。

public partial class MainWindow : Window
{
    static MainWindow()
    {
        Window.TopmostProperty.OverrideMetadata(typeof(MainWindow),
            new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.None,
                new PropertyChangedCallback(OnTopMostChanged)));
    }
    public event EventHandler TopmostChanged;
    private static void OnTopMostChanged(DependencyObject d,
        DependencyPropertyChangedEventArgs e)
    {
        MainWindow mv = (MainWindow)d;
        if (mv.TopmostChanged != null)
            mv.TopmostChanged(mv, EventArgs.Empty);
    }

    private void ChangeTopmostBtn_Click(object sender, RoutedEventArgs e)
    {
        this.Topmost = !this.Topmost;
    }
    ...
}

当我点击我的ChangeTopmost按钮时,我进入了OnTopMostChanged方法。因此,如果你这样做并且有人注册了TopmostChanged事件,它将获得该事件。

答案 1 :(得分:1)

您可以使用MyTopmostDependencyProperty创建自己的PropertyChangedCallback,您可以在其中引发通知事件并将其绑定到原始TopmostDependencyProperty

public static readonly DependencyProperty MyTopmostProperty =
  DependencyProperty.Register("MyTopmost",
    typeof(bool),
    typeof(MyWindow),
    new FrameworkPropertyMetadata {
      PropertyChangedCallback = new PropertyChangedCallback(OnMyTopmostChanged)
    }
);

答案 2 :(得分:1)

尝试实现NotifyPropertyChanged接口。您可以在MSDN上阅读有关此界面的更多信息。 (如何:实施财产变更通知)