C# MenuItem,可以显示资源URI属性中的.png和基于矢量的图像
我在资源字典中有以下C# MenuItem,可以显示资源URI属性中的.png和基于矢量的图像,c#,wpf,xaml,mvvm,icons,C#,Wpf,Xaml,Mvvm,Icons,我在资源字典中有以下MenuItem样式 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Controls="clr-namespace:GambitFramework
MenuItem
样式
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:GambitFramework.Modules.MainMenu.Controls"
xmlns:Converters="clr-namespace:GambitFramework.Core.Converters"
xmlns:Behaviors="clr-namespace:GambitFramework.Modules.MainMenu.Behaviors">
<Converters:NullableValueConverter x:Key="NullableValueConverter"/>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
<Image x:Key="MenuItemIcon"
x:Shared="false"
Source="{Binding IconSource, Converter={StaticResource NullableValueConverter}}"/>
<Style x:Key="MenuItem" TargetType="{x:Type Controls:MenuItemEx}">
<Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<Setter Property="InputGestureText" Value="{Binding InputGestureText}"/>
<Setter Property="Icon" Value="{StaticResource MenuItemIcon}"/>
<Setter Property="IsCheckable" Value="{Binding IsChecked, Mode=OneWay}"/>
<Setter Property="IsChecked" Value="{Binding IsChecked, Mode=OneWay}"/>
<Setter Property="Command" Value="{Binding Command}"/>
<Setter Property="Behaviors:MenuBehavior.UpdateCommandUiItems" Value="True"/>
</Style>
<HierarchicalDataTemplate x:Key="MenuTemplate" ItemsSource="{Binding Children}">
<ContentPresenter Content="{Binding Path=Text}" RecognizesAccessKey="True"/>
</HierarchicalDataTemplate>
</ResourceDictionary>
现在,我有一个巨大的矢量图形图标库,我想添加一个功能,可以为.png指定一个URI,或者在资源字典中指定一些矢量图形资源,比如
<ResourceDictionary x:Class="resources_icons_xaml"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Canvas x:Key="appbar_acorn" Width="48" Height="48" Clip="F1 M 0,0L 48,0L 48,48L 0,48L 0,0">
<Path Width="22.3248" Height="25.8518" Canvas.Left="13.6757" Canvas.Top="11.4012" Stretch="Fill" Fill="{DynamicResource BlackBrush}" Data="F1 M 16.6309,18.6563C 17.1309,8.15625 29.8809,14.1563 29.8809,14.1563C 30.8809,11.1563 34.1308,11.4063 34.1308,11.4063C 33.5,12 34.6309,13.1563 34.6309,13.1563C 32.1309,13.1562 31.1309,14.9062 31.1309,14.9062C 41.1309,23.9062 32.6309,27.9063 32.6309,27.9062C 24.6309,24.9063 21.1309,22.1562 16.6309,18.6563 Z M 16.6309,19.9063C 21.6309,24.1563 25.1309,26.1562 31.6309,28.6562C 31.6309,28.6562 26.3809,39.1562 18.3809,36.1563C 18.3809,36.1563 18,38 16.3809,36.9063C 15,36 16.3809,34.9063 16.3809,34.9063C 16.3809,34.9063 10.1309,30.9062 16.6309,19.9063 Z "/>
</Canvas>
...
</ResourceDictionary>
绑定源所在的位置
public Canvas IconSource
{
get { return iconSource; }
set
{
iconSource = value;
IconVisibility = iconSource == null ?
Visibility.Collapsed :
Visibility.Visible;
NotifyOfPropertyChange(() => IconSource);
}
}
首先,您需要更好地建模您的类。矢量图形没有“URI” 从这个开始:
public abstract class IconPresentation{}
public sealed class ImageIconPresentation : IconPresentation
{
private readonly string _url;
public Uri IconSource
{
get { return new Uri(_url); }
}
public ImageIconPresentation(string url){
_url = url;
}
}
public sealed class ResourceIconPresentation : IconPresentation
{
public string Name
{
get;
private set;
}
public ResourceIconPresentation(string name){
Name = name;
}
}
完成此操作后,您必须修改图标的模板
:
<Setter Property="Icon">
<Setter.Value>
<ContentControl Content="{Binding Icon}"/>
</Setter.Value>
</Setter>
就这样
您的viewmodel将具有如下属性:
public IconPresentation Icon { get; private set; }
另外,我使用了“StaticResource键绑定”,这在默认情况下是不可用的。从这里可以找到:您可以应用类似的方法,这样您就可以随意输入,甚至可以传入依赖项属性来动态更改不同颜色的路径填充等内容。很简单。谢谢你,但我希望能够同时显示.png图像和基于矢量的图像。这只适用于基于矢量的图像,或者我遗漏了什么?它适用于任何你可能想要扔进去的东西。如果您使用该示例,则表示“将xaml粘贴到此处”的部分可以是您想要的任何内容。它可以是一个图像,一条路径,一组控件,另一个视图,随便什么。然后,如果您想让它更具动态性,可以对诸如Data=或Src=之类的属性执行TemplateBinding,如
标记
,并传入任何资源或字符串,或任何您想要的内容。但问题的关键恰恰是缺少的XAML。我可以有一个
,在这种情况下,我将使用一个.png的URI,或者一个
和一个
作为
,但我可以两者都有。同样,我可能遗漏了一些东西,但如果你能提供一个简单的例子,我将非常感谢,我将很高兴奖励一些代表!再次感谢您抽出时间。祝您一切顺利…非常感谢您抽出时间,非常感谢。我现在就开始实施……这似乎不起作用。您是否实现了类似的功能?我使用接口类型IIconPresentation
(由其他两个类继承)创建的对我的图标的绑定不起作用,它没有失败,只是在使用Snoop检查时,它根本不会出现在ContentPresenter中。有什么想法吗?@Killercam:数据绑定引擎不能与接口一起工作。你真的应该拥有我发布的那个(抽象类)。天哪,我为什么要做这些事。明显地再次感谢!
<Setter Property="Icon">
<Setter.Value>
<ContentControl Content="{Binding Icon}"/>
</Setter.Value>
</Setter>
<DataTemplate DataType="{x:Type ImageIconPresentation}">
<Image Source="{Binding IconSource}" />
</DataTemplate>
<DataTemplate DataType="{x:Type ResourceIconPresentation}">
<Rectangle ..>
<Rectangle.Fill>
<VisualBrush Stretch="Uniform"
Visual="{ext:ResourceKeyBinding Path=Name}"/>
</Rectangle.Fill>
</Rectangle>
</DataTemplate>
public IconPresentation Icon { get; private set; }