在Caliburn IWindowManager界面中集成闪烁任务栏

本文关键字:集成 闪烁 任务栏 界面 Caliburn IWindowManager | 更新日期: 2023-09-27 18:37:10

为了闪烁任务栏,我找到了以下代码:https://stackoverflow.com/a/5118285/1830639,它给了我 2 个我关心的扩展方法:

window.FlashWindow(5);
window.StopFlashingWindow();

我正在创建某种聊天信使,有两个有趣的场景:

  1. 当用户单击以聊天已打开的聊天时,焦点打开窗口。
  2. 当消息到达已打开的聊天时闪烁打开的窗口。

1.我已经完成了以下 (https://stackoverflow.com/a/14765848/1830639):

 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();
            }
        }
    }

聊天管理器

 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.我想在 IWindowManagerBlink() 上实现一个扩展方法,但是在扩展方法中,我无法访问我在 MetroWindowManager 中创建的 WeakReferenceswindows 变量):

 public void MessageFor(Contact contact, IChatMessage message)
    {
        var viewModel = CreateOrGetViewModel(contact);
        windowManager.Blink(viewModel);
    }

有什么想法吗?

在Caliburn IWindowManager界面中集成闪烁任务栏

我已经想通了。如果有人感兴趣,将共享代码。

我创建了自己的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
    }

简单注射器自举器

var windowManager = new MetroWindowManager();
        container = new Container();
        container.Register<Communicator.Core.IWindowManager>(()=> windowManager);
        container.Register<Caliburn.Micro.IWindowManager>(() => windowManager);

每当我依赖于我的IWindowManagerCaliburn.Micro.IWindowManager时,IoC 都会传递相同的实例。