在 Caliburn IWindowManager 界面中集成闪烁任务栏
Integrate blink taskbar in Caliburn IWindowManager interface
为了使任务栏闪烁,我找到了以下代码:,它提供了我关心的 2 个扩展方法:
window.FlashWindow(5);
window.StopFlashingWindow();
我正在创建某种聊天信使,有两个有趣的场景:
- 焦点打开 window 当用户点击聊天已打开的聊天时。
- 当消息到达已打开的聊天时,闪烁打开 window。
1. 我完成了以下 ():
public class MetroWindowManager : WindowManager
{
private IDictionary<WeakReference, WeakReference> windows = new Dictionary<WeakReference, WeakReference>();
public override void ShowWindow(object rootModel, object context = null, IDictionary<string, object> settings = null)
{
NavigationWindow navWindow = null;
if (Application.Current != null && Application.Current.MainWindow != null)
{
navWindow = Application.Current.MainWindow as NavigationWindow;
}
if (navWindow != null)
{
var window = CreatePage(rootModel, context, settings);
navWindow.Navigate(window);
}
else
{
var window = GetExistingWindow(rootModel);
if (window == null)
{
window = CreateWindow(rootModel, false, context, settings);
windows.Add(new WeakReference(rootModel), new WeakReference(window));
window.Show();
}
else
{
window.Focus();
}
}
}
ChatManager:
public class ChatManager : IChatManager
{
private readonly IChatWindowSettings chatWindowSettings;
private readonly IWindowManager windowManager;
private IDictionary<WeakReference, WeakReference> chats;
public ChatManager(IChatWindowSettings chatWindowSettings, IWindowManager windowManager)
{
this.chatWindowSettings = chatWindowSettings;
this.windowManager = windowManager;
chats = new Dictionary<WeakReference, WeakReference>();
}
public void OpenFor(Contact contact)
{
var settings = chatWindowSettings.Create();
var viewModel = CreateOrGetViewModel(contact);
windowManager.ShowWindow(viewModel, null, settings);
}
private ChatViewModel CreateOrGetViewModel(Contact contact)
{
ChatViewModel viewModel;
if (!chats.Any(c => c.Key.IsAlive && c.Key.Target == contact))
{
viewModel = new ChatViewModel(contact);
chats.Add(new WeakReference(contact), new WeakReference(viewModel));
}
else
{
var chat = chats.Single(d => d.Key.Target == contact).Value;
if (!chat.IsAlive)
{
viewModel = new ChatViewModel(contact);
chats.Add(new WeakReference(contact), new WeakReference(viewModel));
}
else
{
viewModel = chat.Target as ChatViewModel;
}
}
return viewModel;
}
如您所见,我依赖于 IWindowManager 接口。现在对于 2. 我想在 IWindowManager Blink() 上实现一个扩展方法,但是在扩展方法我无权访问我在 MetroWindowManager:
public void MessageFor(Contact contact, IChatMessage message)
{
var viewModel = CreateOrGetViewModel(contact);
windowManager.Blink(viewModel);
}
有什么想法吗?
我已经弄明白了。如果有人感兴趣,将共享代码。
我创建了我自己的 IWindowManager
,它扩展了 Caliburn.Micro.IWindowManager
。关键在于如何为两个接口获取 相同的实例 :
/// <summary>
/// Extends Caliburn.Micro.IWindowManager functionalities, such as blinking windows.
/// </summary>
public interface IWindowManager : Caliburn.Micro.IWindowManager
{
void Blink(object rootModel);
}
MetroWindowManager:
public class MetroWindowManager : WindowManager, Communicator.Core.IWindowManager
{
private IDictionary<WeakReference, WeakReference> windows = new Dictionary<WeakReference, WeakReference>();
public void Blink(object rootModel)
{
//have access to 'windows' dictionary
}
SimpleInjector 引导程序:
var windowManager = new MetroWindowManager();
container = new Container();
container.Register<Communicator.Core.IWindowManager>(()=> windowManager);
container.Register<Caliburn.Micro.IWindowManager>(() => windowManager);
每当我对 IWindowManager
或 Caliburn.Micro.IWindowManager
有依赖时,IoC 都会传递相同的实例。
为了使任务栏闪烁,我找到了以下代码:,它提供了我关心的 2 个扩展方法:
window.FlashWindow(5);
window.StopFlashingWindow();
我正在创建某种聊天信使,有两个有趣的场景:
- 焦点打开 window 当用户点击聊天已打开的聊天时。
- 当消息到达已打开的聊天时,闪烁打开 window。
1. 我完成了以下 ():
public class MetroWindowManager : WindowManager
{
private IDictionary<WeakReference, WeakReference> windows = new Dictionary<WeakReference, WeakReference>();
public override void ShowWindow(object rootModel, object context = null, IDictionary<string, object> settings = null)
{
NavigationWindow navWindow = null;
if (Application.Current != null && Application.Current.MainWindow != null)
{
navWindow = Application.Current.MainWindow as NavigationWindow;
}
if (navWindow != null)
{
var window = CreatePage(rootModel, context, settings);
navWindow.Navigate(window);
}
else
{
var window = GetExistingWindow(rootModel);
if (window == null)
{
window = CreateWindow(rootModel, false, context, settings);
windows.Add(new WeakReference(rootModel), new WeakReference(window));
window.Show();
}
else
{
window.Focus();
}
}
}
ChatManager:
public class ChatManager : IChatManager
{
private readonly IChatWindowSettings chatWindowSettings;
private readonly IWindowManager windowManager;
private IDictionary<WeakReference, WeakReference> chats;
public ChatManager(IChatWindowSettings chatWindowSettings, IWindowManager windowManager)
{
this.chatWindowSettings = chatWindowSettings;
this.windowManager = windowManager;
chats = new Dictionary<WeakReference, WeakReference>();
}
public void OpenFor(Contact contact)
{
var settings = chatWindowSettings.Create();
var viewModel = CreateOrGetViewModel(contact);
windowManager.ShowWindow(viewModel, null, settings);
}
private ChatViewModel CreateOrGetViewModel(Contact contact)
{
ChatViewModel viewModel;
if (!chats.Any(c => c.Key.IsAlive && c.Key.Target == contact))
{
viewModel = new ChatViewModel(contact);
chats.Add(new WeakReference(contact), new WeakReference(viewModel));
}
else
{
var chat = chats.Single(d => d.Key.Target == contact).Value;
if (!chat.IsAlive)
{
viewModel = new ChatViewModel(contact);
chats.Add(new WeakReference(contact), new WeakReference(viewModel));
}
else
{
viewModel = chat.Target as ChatViewModel;
}
}
return viewModel;
}
如您所见,我依赖于 IWindowManager 接口。现在对于 2. 我想在 IWindowManager Blink() 上实现一个扩展方法,但是在扩展方法我无权访问我在 MetroWindowManager:
public void MessageFor(Contact contact, IChatMessage message)
{
var viewModel = CreateOrGetViewModel(contact);
windowManager.Blink(viewModel);
}
有什么想法吗?
我已经弄明白了。如果有人感兴趣,将共享代码。
我创建了我自己的 IWindowManager
,它扩展了 Caliburn.Micro.IWindowManager
。关键在于如何为两个接口获取 相同的实例 :
/// <summary>
/// Extends Caliburn.Micro.IWindowManager functionalities, such as blinking windows.
/// </summary>
public interface IWindowManager : Caliburn.Micro.IWindowManager
{
void Blink(object rootModel);
}
MetroWindowManager:
public class MetroWindowManager : WindowManager, Communicator.Core.IWindowManager
{
private IDictionary<WeakReference, WeakReference> windows = new Dictionary<WeakReference, WeakReference>();
public void Blink(object rootModel)
{
//have access to 'windows' dictionary
}
SimpleInjector 引导程序:
var windowManager = new MetroWindowManager();
container = new Container();
container.Register<Communicator.Core.IWindowManager>(()=> windowManager);
container.Register<Caliburn.Micro.IWindowManager>(() => windowManager);
每当我对 IWindowManager
或 Caliburn.Micro.IWindowManager
有依赖时,IoC 都会传递相同的实例。