2

我正在尝试找出一种在运行时更改边框视觉画笔的方法,并将视觉设置为 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 是“StaticResource appbar_star”,但我该怎么做

 Border.Opacitymask = VisualBrush() { Visual = (Visual)ICONNAME };

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

4

1 回答 1

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>
于 2015-10-26T07:42:18.427 回答