Создание вспомогательного класса для ballontip, к которому можно получить доступ с любой страницы wpf - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть приложение wpf, которое использует NavigationWindow, которое позволяет мне загружать страницы в MasterWindow.

Я пытаюсь добавить в приложение функцию уведомления http://www.codeproject.com/KB/WPF/wpf_notifyicon.aspx, которая позволит мнечтобы отобразить окно уведомлений, когда я хочу.

Я добавил Taskbaritem в свое окно навигации

 <tb:TaskbarIcon x:Name="MyNotifyIcon" ToolTipText="My Application" IconSource="/Images/Icons/TB.ico"/>

Я хочу иметь возможность создать вспомогательный класс, который может получить доступ к MyNotifyIcon из любого изстраницы загружены.Я думал что-то вроде

  public static void DisplayMessageArea(string messageToDisplay)
    {
        var balloon = new StandardNotification {BalloonMessage = messageToDisplay };

        //TaskbarIcon tb = (TaskbarIcon)MasterWindow.Resources.FindName("MyNotifyIcon");
        //tb.ShowCustomBalloon(balloon,PopupAnimation.Slide,4000);

    }

Однако я не знаю, как правильно найти контроллер "MyNotifyIcon" из моего вспомогательного класса.

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 05 декабря 2011

Я никогда раньше не видел этот 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, прежде чем что-либо с ним делать, и имейте в виду, что статическое свойство будет работать, возвращая значение, независимо от того, был ли загружен или даже создан экземпляр вашего элемента управления, содержащий его.

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