通过App.xaml绑定加载ResourceDictionary?

时间:2014-07-01 12:16:40

标签: c# wpf xaml mvvm resourcedictionary

我有一个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}}" />

但是当我拥有它时,它会在我的视图中出现一堆奇怪的错误。

2 个答案:

答案 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,以添加/删除正确的资源字典