UWP c # Доступ к текстовому блоку MainPage из класса - PullRequest
0 голосов
/ 19 октября 2018

На главной странице XAML у меня есть CommandBar, который я использую для отображения основных кнопок приложения и области сообщений.Это выглядит примерно так:

      <CommandBar x:Name="topcmdbar" Grid.Column="0 " Grid.ColumnSpan="3" 
                IsDynamicOverflowEnabled="False" ClosedDisplayMode="Compact" 
                VerticalAlignment="Top" Opacity=".5" 
                Background="Transparent" Visibility="Visible" 
                >
        <CommandBar.Content>
            <Grid >
                <TextBlock  x:Name="TopCmdBarContent" x:FieldModifier="public" HorizontalAlignment="Left" Margin="10,5,0,0" VerticalAlignment="Stretch"/>
            </Grid>
        </CommandBar.Content>
        <AppBarButton FontFamily="Segoe MDL2 Assets" Content="&#xE838;" FontSize="18"  Label="Open Folder" Tapped="StartNewPlaylist" HorizontalAlignment="Left"/>
        <AppBarButton  etc etc etc........

У меня есть класс, который, помимо прочего, загружает файлы для приложения.Я хотел бы отобразить из этого класса прогресс загрузки в TopCmdBarContent.

Я пробовал различные стратегии для этого, например, для передачи MainPage в качестве аргумента методу, который инициализирует класс, ноЯ не могу получить к нему доступ.Я даже думал о создании из класса своего собственного сообщения о прогрессе, но тогда мне нужно было бы получить доступ к сетке с главной страницы, чтобы повесить ее на ....

Так, например,Мне нужно иметь метод, который делает что-то подобное в классе:

        public async void InitializePlayList()
        {   
            int countfiles=0;
            StorageFolder f = await GetSelectedFolderAsync();
            foreach (var file in f) 
                 {
                   Do_a_bunch_of_stuff(f);
                   countfiles+=1;
                   TopCmdBarContent="Hang in there, "countfiles.ToString()+" processed";

        }

Я пытался это потенциальное решение , но я продолжаю получать эту ошибку: «Приложение называется интерфейсомэто было назначено для другого потока. (Исключение из HRESULT: 0x8001010E) "

Есть идеи, как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Ладно ... наконец-то понял ... после сильного потоотделения и произнесения множества плохих слов.

Оба подхода работают (передача ссылки на TextBlock или использование сообщения WMMW, но это был неправильный вызов диспетчера. Вот правильный синтаксис, на случай, если он кому-то поможет:

      Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => {MessagePad = "blablabla";});

Синтаксис этой вещи!

Я делалпрограммирование уже более 40 лет на неисчислимом количестве языков программирования, и я не могу поверить, что кто-то думал, что это будет правильным способом сказать это на c #, новом, современном языке программирования! .... боже .... Будучи из КанадыТеперь я могу по закону сказать, что этот парень, должно быть, курил очень, очень хорошую травку ..... Заставляет меня скучать по Коболу!

0 голосов
/ 20 октября 2018

Это немного связано с паттерном MVVM.Но не сложно.

  1. Установить пакет Nuget MvvmLightLibs.
  2. Зарегистрировать прослушиватель сообщений в методе конструктора MainPage.xaml.cs.

    GalaSoft.MvvmLight.Messaging.Messenger.Default.Register(this, "count_changed", (value) =>
            {
                TopCmdBarContent.Text = "What ever you want";
            });

В вашем методе InitializePlayList () отправьте сообщение

public async void InitializePlayList () {// Ваш код обработки .... .... ... GalaSoft.MvvmLight.Messaging.Messenger.Default.Send (count.ToString (), "count_changed");}

Вот и все

На самом деле вы можете делать это с помощью EventHandler, но для простоты здесь я рекомендую вам использовать MvvvmLightLibs

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