2017-02-07 4 views
-2

Моя цель - показать оповещение в течение 5 секунд. Я использую Hardcodet.NotifyIcon.Wpf библиотеку и после this учебникПочему я получаю эту ошибку: «Вызывающий поток должен быть STA, потому что многие компоненты пользовательского интерфейса требуют этого»?

Demo Code

public partial class MainWindow : Window 
{ 
     public MainWindow() 
     { 
      InitializeComponent(); 
      new Timer(_ => ShowBallon(), null, 0, 1000 * 5); 
     } 

     private void ShowBallon() 
     { 
      string title = "WPF NotifyIcon"; 
      string text = "This is a standard balloon"; 
      new TaskbarIcon().ShowBalloonTip(title, text, BalloonIcon.None); //Error is thrown in this line 
     } 
} 

Сообщение об ошибке

enter image description here

+0

Что вы не знаете об ошибке? Сообщение довольно просто о том, что не так, и что вам нужно изменить для работы программы. – Servy

+0

@Servy Я не эксперт в C#. Что я должен сделать? – Elkin

+0

Вы прочитали сообщение об ошибке? Он точно сообщает, почему ваш код не работает. Вам не нужно быть экспертом в C#. Это говорит вам, что именно не так. – Servy

ответ

3

Вы получаете это исключение, потому что Timer обратного вызова выполняется в потоке поток бассейна, который не имеет ApartmentState.STA, который необходим для создания элементов интерфейса WPF.

Лучше использовать класс DispatcherTimer, в котором есть событие Tick, которое запускается в потоке пользовательского интерфейса.

Используйте его, как показано ниже, для одноразового действия. Если вы намеревались периодически выполнять обработчик Tick, просто удалите оператор Stop().

public MainWindow() 
{ 
    InitializeComponent(); 

    var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(5) }; 
    timer.Tick += ShowBallon; 
    timer.Start(); 
} 

private void ShowBallon(object sender, EventArgs e) 
{ 
    ((DispatcherTimer)sender).Stop(); 

    string title = "WPF NotifyIcon"; 
    string text = "This is a standard balloon"; 
    new TaskbarIcon().ShowBalloonTip(title, text, BalloonIcon.None); 
}