【发布时间】:2015-01-15 16:53:41
【问题描述】:
我在资源字典中有以下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 资源类型,我的 IconSource 属性可能类似于
public override Uri IconSource
{
get { return new Uri("pack://application:,,,/GambitFramework;component/Resources/Icons/Undo.png"); }
}
现在,我有一个大型矢量图形图标库可供我使用,我想添加一个功能,以指定 .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>
如何修改我的 MenuItem 样式,以便我可以同时使用 .png 的 URI 和矢量图形的 URI?
我主要感兴趣的是如何在 XAML 中以适当的方式区分和显示资源,我从未见过这样做,我对如何去做感到困惑。
感谢您的宝贵时间。
在以前版本的系统中,我只有矢量图形支持,而我的 MenuItem 样式的 XAML 是
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Caliburn="http://www.caliburnproject.org"
xmlns:Converters="clr-namespace:GambitFramework.Core.Converters"
xmlns:Controls="clr-namespace:GambitFramework.Modules.MainMenu.Controls">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<Converters:StringToResourceConverter x:Key="StringToResourceDictionary"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<Rectangle x:Key="MenuItemIcon" x:Shared="False"
Visibility="{Binding IconVisibility}"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Width="16" Height="16">
<Rectangle.Fill>
<VisualBrush Stretch="Uniform" Visual="{Binding IconSource}"/>
</Rectangle.Fill>
</Rectangle>
<Style x:Key="MenuItem" TargetType="{x:Type Controls:MenuItemEx}">
<Setter Property="Icon" Value="{StaticResource MenuItemIcon}"/>
<Setter Property="InputGestureText" Value="{Binding InputGestureText}"/>
<Setter Property="Caliburn:Action.Target" Value="{Binding}"/>
<Setter Property="Caliburn:Message.Attach" Value="{Binding ActionText}"/>
</Style>
<Style x:Key="CheckableMenuItem"
TargetType="{x:Type Controls:MenuItemEx}"
BasedOn="{StaticResource MenuItem}">
<Setter Property="IsCheckable" Value="True"/>
<Setter Property="IsChecked" Value="{Binding IsChecked}"/>
</Style>
<HierarchicalDataTemplate x:Key="MenuTemplate"
ItemsSource="{Binding Children}">
<ContentPresenter Content="{Binding Path=Text}" RecognizesAccessKey="True"/>
</HierarchicalDataTemplate>
</ResourceDictionary>
绑定源在哪里
public Canvas IconSource
{
get { return iconSource; }
set
{
iconSource = value;
IconVisibility = iconSource == null ?
Visibility.Collapsed :
Visibility.Visible;
NotifyOfPropertyChange(() => IconSource);
}
}
【问题讨论】:
-
您可以应用this from an old post 之类的东西,这样就可以随意放入您想要的任何东西,甚至可以传递依赖属性来动态更改不同颜色的路径填充等内容。轻松愉快。
-
感谢您,但我希望能够同时显示 .png 图像和基于矢量的图像。这仅适用于基于矢量的图像还是我错过了什么?
-
它适用于您想要放入的任何内容。如果您按照该示例进行操作,则显示“在此处粘贴您的 xaml”的部分可以是您想要的任何内容。它可以是一个图像、一个路径、一堆控件、另一个视图,等等。然后,如果您希望它更具动态性,您可以对 Data= 或 Src= 之类的 TemplateBinding 或
Tag之类的属性执行任何操作,并传入任何资源、字符串或任何您想要的内容。 -
但正是缺少的 XAML 才是问题的症结所在。我可以要么拥有
<Image ...>,在这种情况下,我将使用指向.png的URI,或使用<Rectangle ...>和<Rectangle.Fill>作为<VisualBrush ...>但我可以两者兼得。再说一次,我可能会遗漏一些东西,但如果你能提供一个简短的例子,那将不胜感激,我很乐意奖励一些代表!感谢你的宝贵时间。万事如意...