gpt4 book ai didi

c# - 如何根据良好做法使用 WPF 打开新窗口?

转载 作者:太空狗 更新时间:2023-10-30 01:24:08 27 4
gpt4 key购买 nike

我读过 WPF(和一般的 GUI)的一个好习惯,说打开尽可能少的窗口。但有时,您根本别无选择。

所以我想到了一个快速优雅的解决方案来打开一个新窗口,我想到了这个:

public static class WinManager
{
private static Dictionary<Type, Func<Window>> collection
= new Dictionary<Type, Func<Window>>();

/* Bind the type of the ViewModel with a lambda that build an
* instance of a window*/
public static void Bind(Func<Window> ctor, Type type) { ... }

/* Search in the dictionary the specified type and show the window
* returned by the lambda*/
public static void Show(Type type){ ... }

/* Search in the dictionary the specified type and show the dialogue
* returned by the lambda*/
public static void ShowDialog(Type type) { ... }
}

type 是绑定(bind)到 View(即窗口)的 ViewModel 的类型,lambda ctor 用于返回窗口的新实例。

像这样管理窗口是个好主意还是我完全错了?

最佳答案

我认为这是一个不错的主意。

它的优点是想要显示另一个窗口的 ViewModel 不必使用任何 WPF 特定代码,甚至不必知道 View 。它只需要知道要为其显示窗口的 ViewModel。这与 Caliburn.Micros 非常相似IWindowManager .

我不喜欢这个解决方案的一点是类的静态性质。这使得单元测试变得困难(呃)。如果您正在使用依赖注入(inject),您可以创建一个接口(interface)和该接口(interface)的实现,类似于您的静态类。然后,您可以在组合根目录中创建该类的一个实例,将 ViewModel 类型绑定(bind)到 lambda View 工厂,并将该实例注册到您的 DI 容器。每个想要显示另一个窗口的 ViewModel 现在都依赖于该接口(interface),这使得它在单元测试中很容易模拟。

像这样:

interface IWindowManager
{
void Show(Type type);
void Show<T>();
void ShowDialog(Type type);
void ShowDialog<T>();
}

class WindowManager : IWindowManager
{
// Implementation of the four methods from the interface plus:

private Dictionary<Type, Func<Window>> collection
= new Dictionary<Type, Func<Window>>();

public void Bind(Func<Window> ctor, Type type) { ... }
}

拥有Bind方法仅在具体实现上WindowManager有利于 IWindowManager 的消费者无法更改注册。

关于c# - 如何根据良好做法使用 WPF 打开新窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10225015/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com