在 Element Host 中托管复合 WPF 应用程序
Hosting a composite WPF application inside an Element Host
我在 Element Host 中托管一个 WPF 应用程序,它在应用程序中有一个 WPF 用户控件。在 WPF 应用程序中的某个时刻(因为我知道 Application
class 将是 null
,我像这样实例化它:
if (Application.Current == null)
{
// create the Application object
new Application();
// merge in your application resources
Application.Current.Resources.MergedDictionaries.Add(
Application.LoadComponent(
new Uri("edit;component/Styles/Styles.xaml",
UriKind.RelativeOrAbsolute)) as ResourceDictionary);
}
问题是每当我关闭 WPF 应用程序内的内部用户控件时,由于某种原因它会导致无法访问资源。它说 Application
对象是 null
即使我在应用程序开始时确实实例化了它。如果我为 null
检查 Application
然后实例化它,它表示当前 AppDomain 中有一个活动的应用程序。
您是说要在 ElementHost 中托管整个应用程序吗?我认为 ElementHost 主要设计用于托管 WPF 控件而不是整个应用程序。
您可能已经遇到过这个问题,但是在尝试使用各种技术让 WPF 控件在 ElementHost 中工作后,我决定只将 Application 对象排除在等式之外,并只在用户控件本身中引用我的资源(所以ElementHost 包含 UserControl 并引用其资源;根本不使用 Application 对象)。
This article 详细介绍了在您决定需要 Application 对象时如何管理 Application。
要在您的控件中引用资源,您可以在您的用户控件中使用以下内容xaml:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyAssembly.NameSpace;component/Resource/ResourceDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
好的,我知道发生了什么事了:
目前,我在 Element Host 中托管了一个 WPF 控件,并且我假设托管在该控件中的任何控件都将解决其从 WPF 到 Win 表单的应用程序映射。唉,事实并非如此。如果您有一个复合控件,请确保每个 WPF 控件都有一个单独的元素宿主控件。
我在 Element Host 中托管一个 WPF 应用程序,它在应用程序中有一个 WPF 用户控件。在 WPF 应用程序中的某个时刻(因为我知道 Application
class 将是 null
,我像这样实例化它:
if (Application.Current == null)
{
// create the Application object
new Application();
// merge in your application resources
Application.Current.Resources.MergedDictionaries.Add(
Application.LoadComponent(
new Uri("edit;component/Styles/Styles.xaml",
UriKind.RelativeOrAbsolute)) as ResourceDictionary);
}
问题是每当我关闭 WPF 应用程序内的内部用户控件时,由于某种原因它会导致无法访问资源。它说 Application
对象是 null
即使我在应用程序开始时确实实例化了它。如果我为 null
检查 Application
然后实例化它,它表示当前 AppDomain 中有一个活动的应用程序。
您是说要在 ElementHost 中托管整个应用程序吗?我认为 ElementHost 主要设计用于托管 WPF 控件而不是整个应用程序。
您可能已经遇到过这个问题,但是在尝试使用各种技术让 WPF 控件在 ElementHost 中工作后,我决定只将 Application 对象排除在等式之外,并只在用户控件本身中引用我的资源(所以ElementHost 包含 UserControl 并引用其资源;根本不使用 Application 对象)。
This article 详细介绍了在您决定需要 Application 对象时如何管理 Application。
要在您的控件中引用资源,您可以在您的用户控件中使用以下内容xaml:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyAssembly.NameSpace;component/Resource/ResourceDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
好的,我知道发生了什么事了:
目前,我在 Element Host 中托管了一个 WPF 控件,并且我假设托管在该控件中的任何控件都将解决其从 WPF 到 Win 表单的应用程序映射。唉,事实并非如此。如果您有一个复合控件,请确保每个 WPF 控件都有一个单独的元素宿主控件。