如何使用矢量图形(在XAML中定义)作为功能区菜单项的图像
本文关键字:功能区 菜单项 图像 定义 何使用 图形 XAML | 更新日期: 2023-09-27 18:29:29
我需要将具有Ribbon
的WPF应用程序转换为对按钮等上的图像使用矢量图形,而不是位图。到目前为止,我已经完成了这项工作,除了RibbonApplicationMenu
项,它们使用RibbonApplicationMenu.ImageSource
属性,键入ImageSource
来设置显示在功能区菜单项左侧的图形。
我的矢量图形在XAML
:中定义如下
<ControlTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ViewBox Width="148.854" Height="150.500">
<Canvas Width="148.854" Height="150.500">
<Path>
<!-- . . . yadda yadda yadda . . . -->
</Path>
</Canvas>
<Viewbox>
</ControlTemplate>
当我将它们设置为Button
等的.Template
时,它们会正确呈现
然而,我不知道如何将它们用于RibbonApplicationMenu
控件中显示的图像。仅仅设置RibbonApplicationMenu
的.Template
属性是不起作用的(它填充了整个控件,似乎破坏了它的功能)。
我尝试使用VisualBrush
,然后将其呈现为RenderTargetBitmap
以用作.ImageSource
(由于我不想深入讨论的原因,我还必须主要在代码背后工作):
ContentControl cc = new ContentControl(); // just picked ContentControl as a test
cc.Template = myTemplate; // assume myTemplate has the proper ControlTemplate
VisualBrush visBrush = new VisualBrush();
visBrush.Visual = cc;
// not really sure about the parameters to this next line
RenderTargetBitmap rend =
new RenderTargetBitmap(148.854, 150.5, 120, 96, PixelFormats.Pbgra32);
rend.Render(cc);
RibbonApplicationMenuItem menu = new RibbonApplicationMenuItem();
menu.ImageSource = render;
这会编译,但只是在图像所在的位置显示一个空白。如果我使用从图像文件加载的BitmapImage
作为.ImageSource
,它将正确显示。
你知道我该怎么做吗?
可能需要做两件事:首先,ControlTemplate
中没有为Canvas
设置明确的大小,您需要为其分配宽度和高度(有关详细信息,请参阅此处的投票结果)。另一件事是,您需要Arrange
和Measure
Viewbox
,以便它具有所需的尺寸。
因此,将矢量图形的xaml更改为类似于:
<ControlTemplate x:Key="Template">
<Viewbox>
<Canvas Height="100" Width="130">
<Path>
<!-- data -->
</Path>
</Canvas>
</Viewbox>
</ControlTemplate>
和代码:
ControlTemplate controlTemplate =
FindResource("Template") as ControlTemplate;
ContentControl content = new ContentControl();
content.Template = controlTemplate;
// ensure control has dimensions
content.Measure(new Size(200, 200));
content.Arrange(new Rect(0, 0, 200, 200));
RenderTargetBitmap render =
new RenderTargetBitmap((int)content.ActualWidth, (int)content.ActualHeight, 120, 96, PixelFormats.Pbgra32);
render.Render(content);
RibbonApplicationMenuItem menu = new RibbonApplicationMenuItem();
menu.ImageSource = render;
希望它能起作用。