Я никогда раньше не видел этот NotifyIcon (кстати, круто), но я взглянул на его API. Я хотел бы предложить вам не называть этот элемент управления и не пытаться найти его в своем коде. Вместо этого в главном окне навигации установите для его datacontext заданный вами вспомогательный класс и свяжите его с его значком источника, tooltiptext и т. Д .:
<tb:TaskbarIcon DataContext="{Binding SomeViewModel}"
IconSource="..."
ToolTipText="{Binding Text}"
Visibility="{Binding IsVisible, Converter=...}" />
(Подробнее о преобразователях значений здесь ).
Теперь класс SomeViewModel будет реализовывать INotifyPropertyChanged и предоставлять такие свойства, как:
bool IsVisible { get; set; }
string Text { get; set; }
... за исключением того, что эти свойства будут иметь фактические методы получения / установки и вызывать событие изменения свойства.
При таком подходе вам не нужно указывать своему уровню представления искать в своем слое просмотра, что на самом деле не идеально. Лучше, если ваше представление (XAML) знает о вашей презентации (коде), но не наоборот, так как это ослабляет связь. В этом случае он ослабляет связь благодаря тому факту, что ваш реальный код не зависит от существования какого-либо именованного элемента управления, объявленного в XAML.
Что касается того, как добраться до этой вспомогательной модели представления, вы можете передать ссылку на нее различным классам, которые могут ее установить, или вы можете иметь элементы управления в окне навигации, вызывающие события, которые слушает окно навигации. для, или вы можете пойти с подходом, который вы имели в виду, который заключается в определении статического метода на модели представления (лично я не сторонник этого подхода, но это наиболее близко к тому, что вы ищете делает).
Однако, если вы настроены на подход, который вы здесь используете, имейте в виду, что он назван в этом элементе управления, поэтому вы можете повторно выставить его как статическое свойство в рассматриваемом элементе управления:
class MyControlWithTipIcon
{
public static TaskbarIcon TaskBarIcon { get { return MyNotifyIcon; } }
}
Теперь вы можете получить к нему доступ из класса вашего помощника:
public static void DisplayMessageArea(string messageToDisplay)
{
MyControlWithTipIcon.TaskBarIcon.ToolTipText = messageToDisplay;
MyControlWithTipIcon.TaskBarIcon.Visibility = ... //i.e. show the message
}
Я бы лично не поддерживал этот подход, но это, вероятно, самый простой способ сделать, в частности, то, что вы просите. Однако, если вы идете по этому пути, не забудьте проверить статическое свойство TaskBarIcon на null, прежде чем что-либо с ним делать, и имейте в виду, что статическое свойство будет работать, возвращая значение, независимо от того, был ли загружен или даже создан экземпляр вашего элемента управления, содержащий его.