Проблема с пользовательскими подсказками WPF BalloonTips с многопоточностью

StackOverflow https://stackoverflow.com/questions/2557483

Вопрос

Я прочитал другой похожий вопрос, но я не могу заставить их относиться к этому, поэтому я подумал, что лучше спросить: «Я новичок в WPF и так далее, поэтому, пожалуйста, поддержите меня».

я использую это http://www.codeproject.com/KB/WPF/wpf_notifyicon.aspx API для работы с пользовательскими Windows WPF (в частности, с FancyBalloon).

Однако я столкнулся со следующей проблемой: кажется, я не могу запустить BalloonTips в отдельной теме (мне это нужно, потому что я анализирую электронные письма, и, следовательно, если, например, есть 3 электронных письма, отображается первое письмо (это работает) хорошо), но когда дело доходит до второго электронного письма, происходит сбой с TargetInvoctionException , {"Указанный элемент уже является логическим дочерним элементом другого элемента.Сначала отключите его."}.

Дело в том, что я предположительно работаю с одним и тем же экземпляром, и раньше я пытался вызвать его, чтобы закрыть, удалить и т. д., но безуспешно.(опять же, если я его удалю, я не смогу создать другой экземпляр, поскольку, очевидно, компоненты пользовательского интерфейса WPF должны вызываться из статического потока, поэтому на протяжении всего цикла электронных писем + отображения всплывающего окна я пытаюсь использовать один и тот же BalloonTip.

Есть предложения, пожалуйста?Я действительно в растерянности, и я уже давно этим занимаюсь :/

Мне было интересно, есть ли кто-нибудь

Это было полезно?

Решение

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

Вы можете либо удалить код пользовательского интерфейса из фонового рабочего потока, либо разумно использовать SynchronizationContext для вызова из фонового потока фрагментов кода для выполнения в потоке пользовательского интерфейса.

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

Другие советы

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

Например, если я попытаюсь выполнить myStackPanel.Children.Add(myUIElement) одновременно в отдельных потоках, ссылаясь на один и тот же объект элемента пользовательского интерфейса, это приведет к ошибке, которую вы видите.

Если вам нужны одни и те же элементы пользовательского интерфейса для нескольких потоков, рассмотрите возможность их клонирования или перемещения логики пользовательского интерфейса в основной поток.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top