我想知道如何將NotifyIcon與Caliburn.Micro整合。如何整合WPF NotifyIcon與Caliburn.Micro
我正在嘗試使用低級Caliburn API與Caliburn集成。下面是類:
ITrayIconManager
public interface ITrayIconManager
{
ITrayIcon GetOrCreateFor<T>();
}
ITrayIcon(包裝紙圍繞TaskbarIcon從WPF的NotifyIcon)
public interface ITrayIcon : IDisposable
{
void ShowBalloonTip(string title, string message, BalloonIcon symbol);
void Show();
void Hide();
}
ISetTrayIconInstance
public interface ISetTrayIconInstance
{
ITrayIcon Icon { set; }
}
TrayIconWrapper
public class TrayIconWrapper : ITrayIcon
{
private readonly TaskbarIcon icon;
public TrayIconWrapper(TaskbarIcon icon)
{
this.icon = icon;
}
public bool IsDisposed { get; private set; }
public void Dispose()
{
icon.Dispose();
IsDisposed = true;
}
public void Show()
{
icon.Visibility = Visibility.Visible;
}
public void Hide()
{
icon.Visibility = Visibility.Collapsed;
}
public void ShowBalloonTip(string title, string message, BalloonIcon symbol)
{
icon.ShowBalloonTip(title, message, symbol);
}
}
TrayIconManager
public class TrayIconManager : ITrayIconManager
{
private readonly IDictionary<WeakReference, WeakReference> icons;
public TrayIconManager()
{
icons = new Dictionary<WeakReference, WeakReference>();
}
public ITrayIcon GetOrCreateFor<T>()
{
if (!icons.Any(i => i.Key.IsAlive && typeof(T).IsAssignableFrom(i.Key.Target.GetType())))
return Create<T>();
var reference = icons.First(i => i.Key.IsAlive && typeof(T).IsAssignableFrom(i.Key.Target.GetType())).Value;
if (!reference.IsAlive)
return Create<T>();
var wrapper = (TrayIconWrapper)reference.Target;
if (wrapper.IsDisposed)
return Create<T>();
return wrapper;
}
private ITrayIcon Create<T>()
{
var rootModel = IoC.Get<T>();
var view = ViewLocator.LocateForModel(rootModel, null, null);
var icon = view is TaskbarIcon ? (TaskbarIcon)view : new TaskbarIcon();
var wrapper = new TrayIconWrapper(icon);
ViewModelBinder.Bind(rootModel, view, null);
SetIconInstance(rootModel, wrapper);
icons.Add(new WeakReference(rootModel), new WeakReference(wrapper));
return wrapper;
}
private void SetIconInstance(object rootModel, ITrayIcon icon)
{
var instance = rootModel as ISetTrayIconInstance;
if (instance != null)
instance.Icon = icon;
}
}
這是代碼,現在我該如何使用它?此代碼依賴於卡利視圖 - 視圖模型結合,那就是,我需要創建一個視圖模型爲TasbarkIcon的圖,(其中必須繼承從TaskbarIcon控制):
TrayIconViewModel
public class TrayIconViewModel : IMainTrayIcon, ISetTrayIconInstance
{
public TrayIconViewModel()
{
}
public ITrayIcon Icon { get; set; }
public void ShowWindow()
{
Icon.Hide();
System.Windows.Application.Current.MainWindow.Show(); //very very bad :(
}
ITrayIcon是TaskbarIcon控件的包裝。現在我可以從ViewModel調用它,這非常棒。
TrayIconView(CAL:消息:連接不工作 - 的ShowWindow從來沒有被擊中)
<tb:TaskbarIcon x:Class="Communicator.Softphone.Views.TrayIconView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:tb="http://www.hardcodet.net/taskbar"
xmlns:cal="http://www.caliburnproject.org"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
IconSource="/Communicator.ControlLibrary;component/Assets/phone_icon.ico"
ToolTipText="Secretária do Futuro - Comunicador"
Visibility="Collapsed"
cal:Message.Attach="[Event TrayLeftMouseDown] = [Action ShowWindow()]">
在我ShellViewModel(托盤圖標是TaskbarIcon周圍的包裝):
private ITrayIcon trayIcon;
protected override void OnActivate()
{
trayIcon = trayIconManager.GetOrCreateFor<IMainTrayIcon>();
ActivateItem(containers.FirstOfType<IPhone>());
}
public override void CanClose(Action<bool> callback)
{
trayIcon.Show();
trayIcon.ShowBalloonTip("Comunicador", "Comunicador foi minimizado", BalloonIcon.Info);
(GetView() as Window).Hide();
callback(false);
}
trayIcon.Show()
正在工作,但trayIcon.ShowBallonTip(...)
不做任何事情,沒有錯誤,沒有什麼。
問題總結:
- 綁定Message.Attach不工作,雖然這個卡利輸出日誌消息,因爲它是工作。
調用ShowBallonTip 包裝似乎不工作,雖然它調用實際的TaskbarIcon方法。(它的工作原理沒有附加調試器)
我期待這個。給我一分鐘 – Frank
對不起...我編輯它,使我的情況下:) – JobaDiniz
對不起,但只是問,你可以引用'System.Windows.Forms',如果是的話,你可以直接初始化NotifyIcon查看模型。希望這可能有點幫助。 –