Обновление содержимого кнопки UWP в UIThread - PullRequest
0 голосов
/ 07 мая 2020

У меня есть кнопка, которая выполняет фоновую задачу (она ищет текст из Inte rnet для всех файлов c musi). И он обновляет содержимое кнопки, увеличивая счетчик по мере получения текста.

    private async void AddLyrics_Click(object sender, RoutedEventArgs e)
    {
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
        {
            string format = Helper.LocalizeMessage("PostParenthesis");
            HyperlinkButton button = (HyperlinkButton)sender;
            int count = MusicLibraryPage.AllSongs.Count;
            for (searchLyricsCounter = 1; searchLyricsCounter < count + 1; searchLyricsCounter++)
            {
                Music music = MusicLibraryPage.AllSongs[searchLyricsCounter - 1];
                string lyrics = await music.GetLyricsAsync();
                //if (string.IsNullOrEmpty(lyrics))
                //{
                //    lyrics = await Controls.MusicLyricsControl.SearchLyrics(music);
                //    await music.SaveLyricsAsync(lyrics);
                //}
                System.Diagnostics.Debug.WriteLine(searchLyricsCounter);
                button.Content = string.Format(format, addLyricsContent, searchLyricsCounter + "/" + count);
            }
            searchLyricsCounter = 0;
            button.Content = Helper.Localize("AddLyrics");
            Helper.ShowNotification("SearchLyricsDone");
        });
    }

Кнопка расположена на странице (SettingsPage) фрейма на главной странице. После того как я переключусь на другую страницу и вернусь к SettingsPage, кнопка перестает обновлять содержимое, хотя поток все еще работает.

Как я могу сохранить обновление содержимого кнопки?

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Просто установите NavigationCacheMode на Enabled.

0 голосов
/ 08 мая 2020

Хранить страницу в кеше. Установите для свойства NavigationCacheMode значение Enabled или Required.

В XAML.

<Page NavigationCacheMode="Enabled">

</Page>

Или в скрытом коде

public sealed partial class SettingsPage : Page
{
    public SettingsPage()
    {
        InitializeComponent();
        NavigationCacheMode = NavigationCacheMode.Enabled;
    }
}

Событие Click уже выполняется в потоке пользовательского интерфейса

private async void AddLyrics_Click(object sender, RoutedEventArgs e)
{    
    HyperlinkButton button = (HyperlinkButton)sender;
    button.IsEnabled = false; // avoid duplicate clicks
    try
    {
        string format = Helper.LocalizeMessage("PostParenthesis");
        int count = MusicLibraryPage.AllSongs.Count;
        int searchLyricsCounter = 1;
        foreach(Music music in MusicLibraryPage.AllSongs)
        {
            string lyrics = await music.GetLyricsAsync();        
            System.Diagnostics.Debug.WriteLine(searchLyricsCounter);
            button.Content = string.Format(format, addLyricsContent, searchLyricsCounter + "/" + count);
        }        
        button.Content = Helper.Localize("AddLyrics");
        Helper.ShowNotification("SearchLyricsDone");
    }
    finally
    {
        button.IsEnabled = true; // Can click now
    }
}

Подробнее о NavigationCacheMode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...