将DispatcherHelper从MVVMLight迁移到Windows Community Toolkit



我正致力于将基于。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;
}
}

相关内容

  • 没有找到相关文章

最新更新