要访问资源,您可以使用:
var resource = System.Windows.Application.Current.FindResource(key);
您可以更进一步,创建一个将资源键映射到资源的转换器,以实现这样的 xaml:
<VisualBrush Visual="{Binding IconKey,Converter={local:KeyToResourceConverter}}" />
您可以像这样创建转换器:
public class KeyToResourceConverter : MarkupExtension, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return System.Windows.Application.Current.FindResource(value as string);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
我个人不喜欢这样的解决方案是 ViewModel 通过与视图相关的键间接依赖于 View,例如,要更改视觉样式,您将不得不更改 ViewModel。
如果您可以将 Mode 设为一个类,则可以使用 DataTemplates,请考虑下一个设置:
视图模型:
interface IMode { }
class FirstMode:IMode { }
class SecondMode : IMode { }
class ThirdMode : IMode { }
class ViewModel
{
public IMode Mode { get; private set; }
}
看法:
<DataTemplate DataType="{x:Type local:FirstMode}">
<Border>
<Border.OpacityMask>
<VisualBrush Visual="{StaticResource appbar_star}" Stretch="Fill" />
</Border.OpacityMask>
</Border>
</DataTemplate>
<DataTemplate DataType="{x:Type local:SecondMode}">
<Border>
<Border.OpacityMask>
<VisualBrush Visual="{StaticResource appbar_control_stop}" Stretch="Fill" />
</Border.OpacityMask>
</Border>
</DataTemplate>
<DataTemplate DataType="{x:Type local:ThirdMode}">
<Border>
<Border.OpacityMask>
<VisualBrush Visual="{StaticResource appbar_control_pause}" Stretch="Fill" />
</Border.OpacityMask>
</Border>
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModel}">
<ContentControl Content="{Binding Mode}"/>
</DataTemplate>