我正致力于将基于。net 4.5的WPF应用程序升级到。net 6。当前应用程序使用的DispatcherHelper
在Windows Community Toolkit中不可用。我找不到任何可以帮助我用WCT中可用的代码替换它的示例代码。我想用Windows Community Toolkit中可用的代码块更新以下代码块:
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
this.SelectedControl = new View.MainMenu();
});
和
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
this.SelectedControl = new View.Project();
});
您可以在这里找到DispatcherHelper
的源代码。在本质上,它是这样的:
- 检查动作是否有效,而不是
null
- 检查调用线程是否已经是UI线程,如果是,直接执行操作,否则将其排队等待异步执行。
public static class DispatcherHelper
{
public static void CheckBeginInvokeOnUI(Action action)
{
if (action == null)
return;
var dispatcher = Application.Current.Dispatcher;
if (dispatcher.CheckAccess())
action();
else
dispatcher.BeginInvoke(action);
}
}
据我所知,工具包中只有DispatcherHelper
替代了UWP,而没有替代WPF。您可以像上面那样使用自己的DispatcherHelper
类型替换调用,或者您可以研究在哪里以及在哪个上下文中使用该方法。你也可以用Invoke
代替对调度程序的同步调用,用InvokeAsync
代替异步调用。
上面的DispatcherHelper
版本被删减到最基本的部分。完整的WPF代码如下所示。它提供的唯一更多的东西是,您可以手动初始化调度程序(加上检查它是否处于活动状态),重置它,以及在调度程序上直接将异步执行的操作排队,但它可能对您没有任何用处。
public static class DispatcherHelper
{
public static Dispatcher UIDispatcher { get; private set; }
public static void CheckBeginInvokeOnUI(Action action)
{
if (action == null)
return;
CheckDispatcher();
if (UIDispatcher.CheckAccess())
action();
else
UIDispatcher.BeginInvoke(action);
}
private static void CheckDispatcher()
{
if (UIDispatcher == null)
throw new InvalidOperationException("The DispatcherHelper is not initialized.n" +
"Call DispatcherHelper.Initialize() in the static App constructor.");
}
public static DispatcherOperation RunAsync(Action action)
{
CheckDispatcher();
return UIDispatcher.BeginInvoke(action);
}
public static void Initialize()
{
if (UIDispatcher != null && UIDispatcher.Thread.IsAlive)
return;
UIDispatcher = Dispatcher.CurrentDispatcher;
}
public static void Reset()
{
UIDispatcher = null;
}
}