我试图找出一种在运行时更改边框可视画笔的方法,并将视觉效果设置为Mahapps.Metro图标。
这里是XAML中边框的样子:
<Border Height="24" Width="24" Margin="12,2,0,12" Background="#585858">
<Border.OpacityMask>
<VisualBrush Visual="{StaticResource appbar_star}" Stretch="Fill" />
</Border.OpacityMask>
</Border>
默认情况下,我将Visual视为&#34; StaticResource appbar_star&#34; 但我该怎么做
Border.Opacitymask = VisualBrush() { Visual = (Visual)ICONNAME };
我不知道如何在运行时访问图标。有什么想法吗?
答案 0 :(得分:0)
要访问您可以使用的资源:
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>