UWP C#将UI对象返回到主线程上的同步扩展方法
我正在尝试为UWP C#将UI对象返回到主线程上的同步扩展方法,c#,multithreading,uwp,windows-10-universal,C#,Multithreading,Uwp,Windows 10 Universal,我正在尝试为页面类编写一个扩展方法,该类将返回一个用户控件,该控件是根网格动态创建的子控件。我遇到的问题是如何处理页面类的内容属性 其目的是返回控件以检查控件的属性,并且主要从主线程调用 以下是我想做的: public static MyUserControl GetControlByTag(this Page page, int tag) { //throws "marshalled from a different thread" exception Grid rootGri
页面
类编写一个扩展方法,该类将返回一个用户控件,该控件是根网格
动态创建的子控件。我遇到的问题是如何处理页面
类的内容
属性
其目的是返回控件以检查控件的属性,并且主要从主线程调用
以下是我想做的:
public static MyUserControl GetControlByTag(this Page page, int tag) {
//throws "marshalled from a different thread" exception
Grid rootGrid = page.Content as Grid;
if(rootGrid != null) {
var controls = rootGrid.Children.OfType<MyUserControl>();
foreach(MyUserControl control in controls)
{
if(control.Tag == tag) return control;
}
return null;
}
我通过MSDN找到了解决方案:
public static MyUserControl GetControlByTag(this Page page, int tag) {
MyUserControl rtn = null;
page.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
Grid rootGrid = page.Content as Grid;
if(rootGrid != null) {
var controls = rootGrid.Children.OfType<MyUserControl>();
foreach(MyUserControl control in controls)
{
if(control.Tag == tag) rtn = control;
}
}
}).AsTask().Wait(); //Runs the dispatcher synchronously
return rtn;
}
public static MyUserControl GetControlByTag(this Page page, int tag) {
MyUserControl rtn = null;
page.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
Grid rootGrid = page.Content as Grid;
if(rootGrid != null) {
var controls = rootGrid.Children.OfType<MyUserControl>();
foreach(MyUserControl control in controls)
{
if(control.Tag == tag) rtn = control;
}
}
}).AsTask().Wait(); //Runs the dispatcher synchronously
return rtn;
}
public static MyUserControl GetControlByTag(this Page page, int tag) {
Grid rootGrid = page.Content as Grid;
if(page.Dispatcher.HasThreadAccess) {
//Code to run
}
else {
page.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
//Code to run
}).AsTask().Wait();
}
}