Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MenuItem,可以显示资源URI属性中的.png和基于矢量的图像_C#_Wpf_Xaml_Mvvm_Icons - Fatal编程技术网

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; }