UWP C#如何在异步方法中更改MainPage外部的Xaml UI矩形填充?

时间:2017-07-05 18:47:13

标签: c# xaml asynchronous uwp windows-10

(Windows 10,UWP,C#,XAML) 我试图从一个不是主要方法的类中更改矩形的填充。我已将我的矩形发送到另一个班级,然后我可以设置它的填充。但是,我需要在正在进行的异步方法中更改Fill(相反,在正在进行的异步方法调用的方法期间),但是当我尝试这样时,我得到一个关于线程的例外:

  

该应用程序调用了一个为a编组的接口   不同的线程。 (HRESULT的例外情况:0x8001010E   (RPC_E_WRONG_THREAD))

所以,我已经读过使用Dispatcher来解决这类问题。只有当我不离开MainPage时,它才适用于我:

    public async void printer()
    {
        await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            Debug.WriteLine("I'm inside the printer before");
           this.staffImageBorder.Fill = new SolidColorBrush(Colors.Blue);
            Debug.WriteLine("I'm inside the printer after");
        });
}

但是,当我从其他类调用此printer()方法时,它只是跳过Fill更改。两个Debug语句都打印。

我尝试将Dispatcher代码移到我的其他班级,但该班级并不知道" Dispatcher"是(我也不......)。

抱歉,我无法提供更多代码,我在一个更简单的例子中难以复制它。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

Dispatcher实际上管理UI线程上的调度事件(并且UI的任何更新都需要在UI线程上完成!)。

如果你想从页面外部访问它,你可以通过Window.Current.Dispatcher访问它(或者如果你不能访问Window那么将其指定为静态变量 - 那里只有一个调度程序每个UI线程/窗口,该窗口中的所有内容共享)

如果它打印了两个Debug语句,但它很可能不会跳过你的代码,但你在其他地方遇到了一些问题。

顺便说一句,你可能想重写为任务而不是async void。

public Task SetPrintFillAsync()
{
    return this.Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
    {
        Debug.WriteLine("I'm inside the printer before");
        this.staffImageBorder.Fill = new SolidColorBrush(Colors.Blue);
        Debug.WriteLine("I'm inside the printer after");
    });
}

并打电话给

await SetPrintFillAsync()