我必须遵循使用命名程序集和相对URI从资源字典中检索Canvas
对象的方法,并将Canvas
绑定到MenuItem
s Icon
。获取矢量图形Canvas
的代码是
public Canvas GetVectorGraphic(string assemblyName, string relativeUri, string name)
{
var imageResourceDictionary = new ResourceDictionary();
imageResourceDictionary.Source =
new Uri(assemblyName + ";component/" + relativeUri, UriKind.Relative)
?? new Uri(relativeUri, UriKind.Relative);
if (imageResourceDictionary.Source == null)
return default(Canvas);
return imageResourceDictionary[name] as Canvas;
}
与MenuItem
的绑定是
<Style x:Key="MenuItem" TargetType="{x:Type Controls:MenuItemEx}">
<Setter Property="Icon">
<Setter.Value>
<Image Source="{Binding IconSource}" Width="16" Height="16"/>
</Setter.Value>
</Setter>
...
我也尝试了
<Setter Property="Icon">
<Setter.Value>
<Rectangle Width="16" Height="16">
<Rectangle.Fill>
<VisualBrush Stretch="Uniform"
Visual="{Binding IconSource}"/>
</Rectangle.Fill>
</Rectangle>
</Setter.Value>
</Setter>
您可以看到我正在尝试将Canvas
上的高度直接设置为16 x 16,并且还可以通过恢复以填充大小的矩形,但这是失败的 - 它只会导致空白图像。如果我遗漏Height
和Width
规格,则生成的图形太大。
当我通过
从字典中读取它时,我还尝试调整Canvas
的大小
...
Canvas c = imageResourceDictionary[name] as Canvas;
c.Height = 16;
c.Width = 16;
return c;
但是这会导致图像消失。
如何正确调整Canvas
对象的大小以适合我的MenuItem
?
修改(部分答案):
我来过很多帖子,但没有一个能解决我在一篇文章中遇到的所有问题。问题:
我如何解决所有问题,但最后一个问题是1.使用正确的矢量图形图像源,在这种情况下我发现填充矩形完成了这项工作。 2.您可以直接绑定到Icon对象以获取图像,但没有真正的方法可以适当地缩放这些图像。 3.您可以使用矩形缩放图像,设置Width
和Height
并使用VisualBrush
填充此图像,但这会使资源在MenuItems
之间变形,因此只有一个会永远出现。要使图标不共享,您必须创建静态资源并设置x:Shared="False"
。最终的XAML看起来像
<Rectangle x:Key="MenuItemIcon" x:Shared="False"
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>
突出问题
我现在遇到的问题是顶级项目也向右移动(下面用红色箭头显示),因为矩形维度被硬编码为16.但是,绑定到Witdh
和{{ 1}}似乎导致图像再次消失......
我现在要尝试模板菜单项并将图标区域设置为自动折叠。欢迎任何其他解决方案...
答案 0 :(得分:1)
Viewbox
可以通过将内容扩展为可用尺寸来轻松处理此类事情
所以从图像中删除尺寸并将图像放在Viewbox中
例如
<Setter Property="Icon">
<Setter.Value>
<Viewbox>
<Image Source="{Binding IconSource}" />
</Viewbox>
</Setter.Value>
</Setter>
如果您想限制可用的尺寸,您可以在Viewbox上应用尺寸
例如
<Viewbox Width="16" Height="16">
Viewbox定义了一个内容装饰器,可以拉伸和缩放单个子节点以填充可用空间。
答案 1 :(得分:1)
如果图标未包含在外部静态容器中,则两个主要问题是共享图标(请参阅编辑问题)。我最终将这一切工作的方式是使用以下XAML:
<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>
Visibility
的默认MainMenuIcon
设置为Visibility.Collapsed
。这提供了以下菜单外观......