提前致谢。
据我所知,应用程序启动时创建的第一个视图称为主视图,其他视图(包括通过在应用程序代码中调用CreateNewView创建的所有视图)都是辅助视图。
我也知道,如果他们不 UI线程,我无法在线程中更新UI。
我在网上搜索了很长时间,但没有找到任何东西。请帮助并尝试提供一些如何实现这一目标的想法。
这是我的代码,为简单起见已简化:
如果我在页面中加载项目:
public sealed partial class MainPage : Page
{
private ObservableCollection<Item> Items;//a GridView bind in this.
public MainPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
Items= new ObservableCollection<Item>();
Update();
}
async void Update()
{
//such as I have a lot of Items
foreach(Item i in Itemlist)
{
Items.add(i);
}
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
CoreApplicationView newView = CoreApplication.CreateNewView();
int newViewId = 0;
await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
Frame frame = new Frame();
frame.Navigate(typeof(MainPage), null);
Window.Current.Content = frame;
// You have to activate the window in order to show it later.
Window.Current.Activate();
newViewId = ApplicationView.GetForCurrentView().Id;
});
bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
}
}
以下是问题:
我们知道,ObservableCollection<T>
有NotifyCollectionChangedEventHandler
,当数据发生变化时,它会通知用户界面线程。
但是辅助视图(New MainPage),运行时,UpDate()方法更改Items列表,然后更改错误(GridView绑定在此)。
该应用程序调用了为不同线程编组的接口。 (来自HRESULT的异常:0x8001010E(RPC_E_WRONG_THREAD))&#34; 在Windows.UI.Xaml.Controls.Image.put_Source(ImageSource值) at APP1.MainPage.XamlBindingSetters.Set_Windows_UI_Xaml_Controls_Image_Source(Image obj,ImageSource value,String targetNullValue) 在APP1.MainPage.MainPage_obj2_Bindings.Update_image(BitmapImage obj,Int32阶段) 在APP1.MainPage.MainPage_obj2_Bindings.Update_(FloderItem obj,Int32阶段) 在APP1.MainPage.MainPa
我的意见是数据已更改,而ObservableCollection调用事件来更新辅助视图的UI,但不在UI线程中。
我认为如果UI线程中有NotifyCollectionChangedEvent,那就没关系了。
有人有想法吗?非常感谢。
答案 0 :(得分:1)
我确实找到了解决这个问题的好方法。
正如我所说的,如果他们不是UI线程,我无法在线程中更新UI,但我的问题不是这个。
在MainPage中,我在MainPage类中使用静态对象.......然后我创建了一个新的View,代码也尝试使用这个静态obj。
取消静态标志,我解决了这个问题。