uwp多视图更新GridView

时间:2017-12-04 12:10:05

标签: c# multithreading uwp

提前致谢。

据我所知,应用程序启动时创建的第一个视图称为主视图,其他视图(包括通过在应用程序代码中调用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);
    }
}

以下是问题:

  1. 我们知道,ObservableCollection<T>NotifyCollectionChangedEventHandler,当数据发生变化时,它会通知用户界面线程。

  2. 但是辅助视图(New MainPage),运行时,UpDate()方法更改Items列表,然后更改错误(GridView绑定在此)。

  3. 该应用程序调用了为不同线程编组的接口。 (来自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,那就没关系了。

    有人有想法吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

我确实找到了解决这个问题的好方法。

正如我所说的,如果他们不是UI线程,我无法在线程中更新UI,但我的问题不是这个。

在MainPage中,我在MainPage类中使用静态对象.......然后我创建了一个新的View,代码也尝试使用这个静态obj。

取消静态标志,我解决了这个问题。