WPF使用绑定来分配静态资源

unc*_*all 18 c# wpf

我正在尝试使用枚举来显示相应的图像.为此,我有一个值转换器,将枚举转换为正确的资源名称.我的资源定义如下:

<UserControl.Resources>
    <BitmapImage x:Key="AlarmCat1" UriSource="/Lib.Infrastructure;component/Resources/msg_cat1.bmp" />
    <BitmapImage x:Key="AlarmCat2" UriSource="/Lib.Infrastructure;component/Resources/msg_cat2.bmp" />
    <BitmapImage x:Key="AlarmCat3" UriSource="/Lib.Infrastructure;component/Resources/msg_cat3.bmp" />
    <converters:JamCategoryToImageConverter x:Key="AlarmCategoryConverter" />
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

这有效:

<Image Source="{StaticResource AlarmCat1}" />
Run Code Online (Sandbox Code Playgroud)

但事实并非如此,调用转换器并传回正确的值.什么是正确的语法?

<Image Source="{StaticResource { Binding CurrentAlarmItem.AlarmCategory, Converter={StaticResource AlarmCategoryConverter}}}" />
Run Code Online (Sandbox Code Playgroud)

为完整起见,这是转换功能:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    switch ((AlarmCategory)value)
    {
        case AlarmCategory.Category1:
            return "AlarmCat1";
        case AlarmCategory.Category2:
            return "AlarmCat2";
        case AlarmCategory.Category3:
            return "AlarmCat3";
        default:
            return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*nck 24

我会在转换器中返回资源:

<Image Source="{Binding CurrentAlarmItem.AlarmCategory, Converter={StaticResource AlarmCategoryConverter}}" />
Run Code Online (Sandbox Code Playgroud)

在您的转换器中执行以下操作:

return Application.Current.FindResource("AlarmCat1") as BitmapImage;
Run Code Online (Sandbox Code Playgroud)

使用resourcedictionary(app.xaml)为整个应用程序设置资源

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary1.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

在你的词典(Dictionary1.xaml)

<BitmapImage x:Key="AlarmCat1" UriSource="bh.jpg" />
Run Code Online (Sandbox Code Playgroud)

由于您的资源现在已在applicationlevel上定义,因此代码现在将找到您的资源并将其还原.


Nit*_*tin 5

你不能绑定StaticResource密钥,因为它不是DependancyProperty.您必须Source使用converter和更新转换器代码直接绑定到枚举以返回Bitmap自身.

第二个选项将用于根据值Triggers设置Source属性enum.

<Image >
   <Image.Style>
      <Style TargetType="{x:Type Image}">
         <Style.Triggers>
            <DataTrigger Binding="{Binding CurrentAlarmItem.AlarmCategory}" 
                         Value="Category1">
               <Setter Property="Source" Value="{StaticResource AlarmCat1}" />
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </Image.Style>
</Image>
Run Code Online (Sandbox Code Playgroud)