在 MVVM WPF Class 库中打开新的 window
Opening new window in a MVVM WPF Class Libary
基本上我正在寻找 this Answer,但是 Class 图书馆 .
我目前正在维护一个更大的 WPF 解决方案,其中每个部分都作为 加载项 加载。
我想为所有这些 加载项 创建一个服务来实现它打开一个 Window
而不使用 中的 UI 元素ViewModel,基本上是这样的:
class WindowService:IWindowService
{
public void ShowWindow(object viewModel)
{
var win = new Window();
win.Content = viewModel;
win.Show();
}
}
为简化起见,假设我们有 4 个项目:
1.客户
- Client.exe - 主窗口和 App.xaml 在这里
- Services.dll - WindowService 和 Reflection 等服务都在这里
- Interfaces.dll - 包含上述程序集的接口
2。加载项
- AddIn.dll - WPF Class 库,包含 WPF View/ViewModel,对接口的引用
我链接的答案在 App.Xaml
中定义了 DataTemplates
,但我无法为 Class 定义 DataTemplates
我当时不知道,因为加载项是在运行时使用 Reflection 加载的。
我应该把我的 DataTemplates
放在哪里,以便让链接的答案适用于 Class 没有 App.Xaml
的图书馆?
我所做的是在我的每个 class 库中都有一个 xaml 资源文件,并以编程方式将它们合并到主应用程序资源中。
假设 class 库项目程序集名称为“MyProject.Client”,它包含资源文件 \Views\Resources\LibraryStyles.xaml。合并它的代码如下所示:
Application.Current.Resources.MergedDictionaries.Add(
new ResourceDictionary
{
Source = new Uri("pack://application:,,,/MyProject.Client;component/Views/Resources/LibraryStyles.xaml",
UriKind.RelativeOrAbsolute)
});
基本上我正在寻找 this Answer,但是 Class 图书馆 .
我目前正在维护一个更大的 WPF 解决方案,其中每个部分都作为 加载项 加载。
我想为所有这些 加载项 创建一个服务来实现它打开一个 Window
而不使用 中的 UI 元素ViewModel,基本上是这样的:
class WindowService:IWindowService
{
public void ShowWindow(object viewModel)
{
var win = new Window();
win.Content = viewModel;
win.Show();
}
}
为简化起见,假设我们有 4 个项目:
1.客户
- Client.exe - 主窗口和 App.xaml 在这里
- Services.dll - WindowService 和 Reflection 等服务都在这里
- Interfaces.dll - 包含上述程序集的接口
2。加载项
- AddIn.dll - WPF Class 库,包含 WPF View/ViewModel,对接口的引用
我链接的答案在 App.Xaml
中定义了 DataTemplates
,但我无法为 Class 定义 DataTemplates
我当时不知道,因为加载项是在运行时使用 Reflection 加载的。
我应该把我的 DataTemplates
放在哪里,以便让链接的答案适用于 Class 没有 App.Xaml
的图书馆?
我所做的是在我的每个 class 库中都有一个 xaml 资源文件,并以编程方式将它们合并到主应用程序资源中。
假设 class 库项目程序集名称为“MyProject.Client”,它包含资源文件 \Views\Resources\LibraryStyles.xaml。合并它的代码如下所示:
Application.Current.Resources.MergedDictionaries.Add(
new ResourceDictionary
{
Source = new Uri("pack://application:,,,/MyProject.Client;component/Views/Resources/LibraryStyles.xaml",
UriKind.RelativeOrAbsolute)
});