在WPF窗口中包含可选资源
我希望能够使用默认位图资源或由WPF窗口中的单独程序集提供的资源。我认为我可以通过在Window.Resources部分中定义默认位图来完成此操作,然后搜索并加载(如果找到)独立可选装配中的资源:
[窗口的xaml文件]
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<BitmapImage x:Key="J4JWizardImage" UriSource="../assets/install.png"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
[窗口构造函数的代码]
try
{
var resDllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Olbert.JumpForJoy.DefaultResources.dll");
if( File.Exists( resDllPath ) )
{
var resAssembly = Assembly.LoadFile( resDllPath );
var uriText =
$"pack://application:,,,/{resAssembly.GetName().Name};component/DefaultResources.xaml";
ResourceDictionary j4jRD =
new ResourceDictionary
{
Source = new Uri( uriText )
};
Resources.Add( J4JWizardImageKey, j4jRD[ "J4JWizardImage" ] );
}
}
catch (Exception ex)
{
}
InitializeComponent();
但是,即使在单独的资源组件存在时,始终显示默认图像。 显然,在窗口定义中定义的资源优先于在构建窗口时添加的资源。
所以我删除了Window.Resources部分,添加了一个独立的资源xaml文件:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Olbert.Wix.views">
<BitmapImage x:Key="DefaultWizardImage" UriSource="../assets/install.png"/>
</ResourceDictionary>
并修改窗口构造函数代码,以便如果未找到单独的程序集,则将添加独立xaml文件中的资源:
if( File.Exists( resDllPath ) )
{
// same as above
}
else
Resources.Add( J4JWizardImageKey, TryFindResource( "DefaultWizardImage" ) );
这在单独的程序集存在时起作用。 但是,由于未找到默认图像资源,因此在单独组件被遗漏时失败。 这可能是因为此窗口不是WPF应用程序的一部分; 这是Wix bootstrapper项目的用户界面。
感觉好像应该有一个更简单的解决方案,我想要做什么,我认为每当设计一个WPF库时都很常见(也就是说,您需要某种方法来允许自定义位图,但是您也想提供一个默认/备用)。
这听起来像你只是获得了资源的初始值,就像XAML被解析时一样。 如果当时不在那里,那就什么都没有; 如果它是一件事情,那只会是一件事情。
这是您在使用StaticResource
检索资源而非DynamicResource
时会看到的行为。 当资源被替换时, DynamicResource
将更新目标。
<Label Content="{DynamicResource MyImageSomewhere}" />
链接地址: http://www.djcxy.com/p/50439.html