如何从绝对uri加载窗口?

时间:2016-07-13 07:07:15

标签: c# wpf xaml

我的工作是打开一个WPF窗口,我所拥有的只是一个绝对的URI:

string path = "pack://application:,,,/ExternalAssembly;component/Window1.xaml";

此窗口位于不同的程序集中。

所以我试着:

Window window = Application.LoadComponent(new Uri(path, UriKind.Absolute)) as Window;
提出异常说:不能使用绝对的uri。 然后我尝试使用XamlReader.Load,但所有加载函数都不接受uri(仅限流)。

那么,我怎样才能加载这样一个窗口和ShowDialog()呢?

修改

我已经阅读了this,我没有尝试过,因为我的想法是:如果我有一个绝对的URI,为什么我需要反思呢?等待更好的答案,谢谢。

编辑2

对不起家伙,我不需要完全调用PrintWindow类,Window类就足够了,因为我需要做的就是调用window.ShowDialog()方法。

3 个答案:

答案 0 :(得分:1)

这不是很简单吗?

Window window = new ExternalAssembly.Window1();
window.ShowDialog();

修改

程序集的项目必须是解决方案的一部分或位于参考列表中。

答案 1 :(得分:1)

根据你的评论:

  

所有组件都在同一个解决方案中,所以我的。但问题是   我的程序集由UI层引用(在我的代码中,   ExternalAssembly),所以我不能从那个程序集中调用任何东西

我可以说,传递URI是非常间接的方式来解决这个任务。 虽然您可以解析包URI并从中获取汇编和类型信息,但最简单的方法是从调用程序集传递窗口或在程序集中声明一些工厂/提供程序,如果您想自己决定,何时创建窗口:

public interface IWindowFactory
{
    Window CreatePrintWindow();
}

public void YourMethod(IWindowFactory windowFactory)
{
    // ...
    var window = windowFactory.CreatePrintWindow();
    // ...
}

答案 2 :(得分:1)

仅仅加载XAML不足以创建WPF窗口。你还需要一些初始化东西的代码,并包含程序逻辑(窗口类)。

您实际需要做的是(静态或动态)加载相应的程序集并实例化Window类。