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 线程中。
效果很好!
我有一个简单的场景 - 我在 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 线程中。
效果很好!