WPF - 使用 modernUI - 如何设置从用户控件生成的 RoutedEvent?

WPF - using modernUI - how can I set up a RoutedEvent generated from a user control?

我有一个简单的场景 - 我在 WPF 应用程序中有一个 "UserControl"。我希望它引发一个事件并在主 window 捕获该事件,因此我可以调用 "show" 以确保显示 window(例如不隐藏在托盘中)。

我从 here and here 了解到 RoutedEvent 是正确的选择。

但是,它很复杂,因为我使用 ModernUI 作为框架来设置 window。看起来不错。

但是,在 MUI 中,我只是填充 "mui:LinkGroup.Links","pages" 的其余构造已为我处理,所以我似乎无法弄清楚如何引用逻辑树来实际设置事件的订阅者。树隐藏在 MUI 中。

所以 - 以前有人这样做过吗?有没有一种方法可以使用 MUI 为 RoutedEvent 注册处理程序?

或者是否有其他方式处理在树上传播的事件?

提前致谢!

您正在实施 MVVM 吗?在该模式中,如果基于像 Caliburn Micro or Prism 这样的框架,您将使用 EventAggregator 来创建分离的通知机制。如果您没有使用这些框架中的任何一个,您可以搜索 EventAggregator 的独立版本。但要确保它使用弱引用来跟踪订阅者。 我绝对更喜欢这种处理冒泡事件的方法。

[编辑] 对于 MVVMLight,您将使用 Messenger class。请参阅 MSDN Magazine 上的 Laurent 文章。

它有一个发送方法

Messenger.Default.Send(new AnyMessage());

和注册方法:

Messenger.Default.Register<AnyMessage>(
this,
message =>
{
  // Do something
});

为了完整起见,感谢 Marius,这是我所做的:

POCO小留言:

class ConnectionStatusChanged
{
    public bool NewStatus;
}

发送消息的代码(从视图模型中的后台线程):

Messenger.Default.Send(new ConnectionStatusChanged{NewStatus = '#YOURTRUEFALSEHERE#'});

Messenger 接收器(有两个 lambda 代表,读起来有点难看):

// Register an MVVM messenger handler to ensure we 
// get any "connection state changed" messages so we can 
// Maximise the window
Messenger.Default.Register<ConnectionStatusChanged>(
    this,
    (status) =>
    {
        // Note dispatcher helper from MVVM - if this occurs
        // we need to use the helper to ensure the "event"
        // fires on the main thread - a background thread trying
        // to manipulate the window will throw an exception.
        DispatcherHelper.CheckBeginInvokeOnUI(
        () => 
        { 
            // Take window out of tray
            Show();
            // Put it on top
            Activate(); 
        });
    });

请注意,我还必须使用 DispatcherHelper,因为发送消息的代码不在主 UI 线程中。

效果很好!