通过代码访问Mahapps.Metro-icons

时间:2014-02-07 20:25:21

标签: c# wpf mahapps.metro

我试图找出一种在运行时更改边框可视画笔的方法,并将视觉效果设置为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 };

我不知道如何在运行时访问图标。有什么想法吗?

1 个答案:

答案 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>