【问题标题】:Getting information if Topmost property is changed如果 Topmost 属性发生更改,则获取信息
【发布时间】:2011-09-23 14:02:49
【问题描述】:

我有一个派生自 Window 的类,我希望在其中的 Topmost 属性发生更改时收到通知。

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

有什么方法可以收到通知吗?

【问题讨论】:

  • 如果您发现以下任何有用的答案,请选择它作为您问题的答案。

标签: c# wpf topmost


【解决方案1】:

我尝试了这个,它似乎对我来说很好。

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 事件,它将获得该事件。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      尝试实现 NotifyPropertyChanged 接口。您可以在MSDN 上阅读有关此接口的更多信息。 (如何:实现属性更改通知)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多