我有一个WPF应用程序需要重新启动,具体取决于配置文件设置。 App.xaml的简单版本是:
的App.xaml
<Application>
...
<Application.Resources>
<ResourceDictionary x:Key="NormalMain">
<ImageBrush x:Key="BackgroundBrush" ImageSource="Images/welcome.png"/>
</ResourceDictionary>
<ResourceDictionary x:Key="AlternateMain">
<SolidColorBrush x:Key="BackgroundBrush" Color="LightGreen"/>
</ResourceDictionary>
</Application.Resources>
...
</Application>
我想在运行时根据配置文件设置加载resourcedictionary。我已经连接了绑定并知道它有效,但我无法确定合并这个特定字典的方法。
MainWindowView.xaml
<Window
(...)
d:DataContext="{d:DesignInstance designer:DesignMainWindowViewModel, IsDesignTimeCreatable=True}"
Background="{StaticResource BackgroundBrush}">
...
<Window.Resources>
//Load dictionary based on binding here?
</Window.Resources>
</Window>
MainWindowViewModel的简单之处如下:
MainWindowViewModel.cs
public class MainWindowViewModel {
public bool IsAlternate {get;set;}
}
有没有办法正确地做到这一点?
编辑:我不想在代码隐藏中加载,并且PACK语法似乎不像在这种情况下为引擎构建的。
编辑2:我在App.xaml中使用此代码有点接近:
<StaticResource ResourceKey="{Binding Path=IsAlternate, Converter={StaticResource BoolToResourceKeyId}}" />
但是当我拥有它时,它会在我的视图中出现一堆奇怪的错误。
答案 0 :(得分:1)
经过几个小时的战斗,我找到了一种不同的处理方式。
我为app.xaml中的控件创建了两个样式:
的App.xaml
...
<valueConverters:IsMainToStyleConverter x:Key="IsMainToStyleConverter" />
<Style x:Key="Main" TargetType="Window">
<Setter Property="Background" Value="{StaticResource MainBackgroundBrush}" />
</Style>
<Style x:Key="Alternate" TargetType="Window">
<Setter Property="Background" Value="{StaticResource AlternateBackgroundBrush}" />
</Style>
...
然后定义了一个可用于定位样式的转换器:
IsMainToStyleConverter.cs
public class IsMainToStyleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Application.Current.TryFindResource((value is bool && ((bool)value) ? "Main" : "Alternate"));
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
修正了我的MainWindowView:
MainWindowView.xaml
<Window
...
d:DataContext="{d:DesignInstance designer:DesignMainWindowViewModel, IsDesignTimeCreatable=True}"
Style="{Binding IsMain, Converter={StaticResource IsMainConverter}}">
...
</Window>
现在,只要我的viewmodel具有正确的属性,转换器就会处理定位样式资源并切换到它,而不必担心超越模式问题或类似的事情。
答案 1 :(得分:0)
根据您的绑定,我认为在XAML中没有语法可以做到这一点。
但你可以做的是在viewModel的PropertyChanged事件上创建一个事件处理程序,在这个处理程序中,检查“IsAlternate”的值,然后使用:
Application.Current.Resources.MergedDictionaries.Add
并打包URI,以添加/删除正确的资源字典