我通过使用
DataTemplate
,附加属性以将图像名称设置为字符串,
IValueConverter
从字符串名称映射到
Drawing
绑定到的对象资源
OpacityMask
.
感谢这些资源:
资源.xaml:
<!-- Note the ordering of elements is important -->
<me:StringToStaticResourceConverter x:Key="ssr" />
<DataTemplate x:Key="inputSplitIconButtonContentTemplate">
<Rectangle Fill="{Binding Foreground, RelativeSource={RelativeSource AncestorType=Button}}" Width="12" Height="12">
<Rectangle.OpacityMask>
<DrawingBrush Drawing="{Binding Path=(me:Buttons.Image), Mode=OneWay, Converter={StaticResource ssr}, RelativeSource={RelativeSource AncestorType=Button}}" Stretch="Uniform" />
</Rectangle.OpacityMask>
</Rectangle>
</DataTemplate>
<Style x:Key="inputSplitIconButton" TargetType="Button" BasedOn="{StaticResource MetroCircleButtonStyle}">
<Setter Property="Margin" Value="0,-4,-4,2" />
<Setter Property="DockPanel.Dock" Value="Right" />
<Setter Property="Width" Value="32" />
<Setter Property="Height" Value="32" />
<Setter Property="TabIndex" Value="10" />
<Setter Property="ContentTemplate" Value="{StaticResource inputSplitIconButtonContentTemplate}" />
</Style>
附件属性.cs:
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace MyProject
{
public static class Buttons
{
public static readonly DependencyProperty ImageProperty = DependencyProperty.RegisterAttached
(
name : "Image",
propertyType : typeof(String),
ownerType : typeof(Buttons),
defaultMetadata: new FrameworkPropertyMetadata( defaultValue: null, flags: FrameworkPropertyMetadataOptions.AffectsRender )
);
public static void SetImage(UIElement element, String value)
{
element.SetValue( ImageProperty, value );
}
public static String GetImage(UIElement element)
{
return (String)element.GetValue( ImageProperty );
}
}
public class StringToStaticResourceConverter : IValueConverter
{
public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
{
return Application.Current.FindResource( value );
}
public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture)
{
return null;
}
}
}
window.xaml(窗口.xaml):
<Button
Style="{StaticResource inputSplitIconButton}"
ToolTip="{x:Static me:Resources.Settings_BrowseFile}"
me:Buttons.Image="appbar_folder_ellipsis_drawing"
/>
它甚至可以在WPF XAML设计器中使用!
我认为可以通过使用
{StaticResource appbar_folder_ellipsis_drawing}
在里面
Window.xaml
只是通过它…是时候做实验了!
更新:简化:
我能够进一步简化我的解决方案并消除
StringToStaticResourceConverter
当我意识到
{StaticResource key}
附加属性也可以正常工作。
-
在
Resources.xaml
以下内容:
-
删除此行:
<me:StringToStaticResourceConverter x:Key="ssr" />
-
这个
<DrawingBrush
行变为:
<DrawingBrush Drawing="{Binding Path=(me:Buttons.Image), Mode=OneWay, RelativeSource={RelativeSource AncestorType=Button}}" Stretch="Uniform" />
-
在
窗口.xaml
以下内容:
-
将附加属性属性值更改为
{StaticResource}
就像这样:
me:Buttons.Image="{StaticResource appbar_folder_ellipsis_drawing}"
.