如何使用矢量图形(在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,它将正确显示。

你知道我该怎么做吗?

如何使用矢量图形(在XAML中定义)作为功能区菜单项的图像

可能需要做两件事:首先,ControlTemplate中没有为Canvas设置明确的大小,您需要为其分配宽度和高度(有关详细信息,请参阅此处的投票结果)。另一件事是,您需要ArrangeMeasure 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;

希望它能起作用。