Как отобразить сообщение в ListBox при привязке источника? - PullRequest
0 голосов
/ 14 февраля 2020

Я новый программист для приложения UWP.

Я попытался показать список строковых сообщений в моем приложении UWP. Я вызываю ShowReceiveMessage и использую Listbox с привязкой к CollectionViewSource с ObservableCollection<string> в качестве источника для отображения сообщений. Я столкнулся с тремя проблемами:

  1. Иногда происходит сбой при отправке сообщения, но я не могу найти причину:

    Произошло необработанное исключение win32 в [6284 или 24324 или 9428] Wcons.exe

  2. Сообщения дублируются при двойном нажатии кнопки.

  3. ListBox прокручивается до конца после каждого нового сообщения.

Ниже мой код:

MainPage. xaml.cs

private ObservableCollection<string> m_OutputList = new ObservableCollection<string>();

private async void ShowReceiveMessage(string szMsg)
{
   await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
   {
       m_OutputList.Add(szMsg);
   });
}

public MainPage()
{
   this.InitializeComponent();
   ResultListSource.Source = m_OutputList;
}

MainPage.xaml

<Page.Resources>
   <CollectionViewSource x:Name="ResultListSource"/>
</Page.Resources>    

<ListBox x:Name="lstResult" ItemsSource="{Binding Source={StaticResource ResultListSource}}" />

1 Ответ

0 голосов
/ 24 февраля 2020

Я уже исправил 2-й / 3-й вопрос, но не могу найти root причину для 1-го вопроса. Он остановится на строке кода: m_OutputList.Add (szMsg) и покажет сообщение об ошибке «Необработанное исключение для типа« System.AccessViolatonException »», возникшее в System.ObjectModel.dll. Попытка чтения или записи защищенной памяти. Это часто и указывает на то, что другая память повреждена.

приведенный ниже код предназначен для нажатия кнопки

private void btnWcosIAPClick(object sender, RoutedEventArgs e)
{
    Task.Run(async () => 
    {
      await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
      {
          m_OutputList.Clear();
          ResultListSource.Source = m_OutputList;
          btnWcosIAP.IsEnabled = lstResult.IsEnabled = false;
      });

      int iRes = BurningData_Run();

      await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
      {
          btnWcosIAP.IsEnabled = lstResult.IsEnabled = true;
          ResultListSource.Source = null;
      });
    });
}            

private int BurningData_Run()
{
 m_DATA.RecvMsgCallback += ShowIAPReceiveMessage;
..
 m_DATA.RecvMsgCallback -= ShowIAPReceiveMessage;
}

m_DATA - это мой привычный класс для выполнения моих функций

...