簡體   English   中英

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

[英]UWP C# How to change Xaml UI rectangle fill outside of MainPage in async method?

(Windows 10,UWP,C#,XAML)我試圖從不是主要方法的類中更改矩形的Fill。 我已經將矩形發送到另一個類,從那里我可以設置它為Fill。 但是,我需要在正在進行的異步方法期間(而是在正在進行的異步方法正在調用的方法期間)更改Fill,但是當我嘗試這樣做時,卻遇到了關於線程的異常:

該應用程序調用了一個已編組為不同線程的接口。 (來自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”是什么(我也不是……)。

抱歉,我無法提供更多代碼,在一個簡單的示例中很難復制它。 任何幫助將不勝感激!

分派器實質上是在UI線程上管理調度事件(並且對UI的任何更新都需要在UI線程上完成!)。

如果您想從頁面外部訪問它,則可以通過Window.Current.Dispatcher訪問它(如果無法訪問Window,則可以將其作為靜態變量分配給某個地方-每個UI線程/窗口只有一個調度程序,該窗口中的所有內容窗口共享)

但是,如果要同時打印兩個Debug語句,則很有可能不會跳過您的代碼,但是其他地方會遇到問題。

順便說一句,您可能希望將其重寫為“任務”而不是異步無效。

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM