我正在编写WPF应用程序。我使用的所有图标都是矢量并存储在独立的ResourceDictionary
中,作为Viewbox
es的系列:
<ResourceDictionary>
<ViewBox x:Shared="False" x:Key="IconKey" Stretch="Uniform">
<Canvas Width="16" Height="16">
<Path ... />
</Canvas>
</ViewBox>
<!-- ... -->
</ResourceDictionary>
我现在正在实现一个用户控件,由于非常具体的要求,我在OnRender方法中从头开始绘制。
我需要在我的控件上渲染这些图标。一种解决方案是栅格化它们然后绘制位图,但问题是,我的控件中的视图可以自由缩放,并且这些图标在放大时看起来很丑陋(而不是矢量)。有没有办法使用ViewBox
呈现DrawingContext
?
答案 0 :(得分:0)
我不知道如何渲染ViewBox
,但是您可以渲染Geometry
,缩放后不会很丑。
我已经在XAML文件中创建了图标。构建操作:页面。
文件:Icon.xaml
<?xml version="1.0" encoding="UTF-8"?>
<Viewbox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Stretch="Uniform">
<Canvas Width="25" Height="25">
<Path Fill="#FF000000" StrokeThickness="0.4">
<Path.Data>
<PathGeometry Figures="M 4.9586532 4.4020592 12.198751 19.198359 V 0.91721594 H 20.200561 h 2.894515 Z" FillRule="Nonzero"/>
</Path.Data>
</Path>
</Canvas>
</Viewbox>
使用DrawingContext
这样的创建方法绘制此图片
void DrawIcon(DrawingContext context, double left, double top, double scale = 1)
{
var transform = new MatrixTransform(scale, 0, 0, scale, left, top);
var viewBox = (Viewbox) Application.LoadComponent(new Uri("/MyProjectNameSpace;component/Icon.xaml", UriKind.Relative));
var canvas = viewBox.Child as Canvas;
if (canvas?.Children == null) return;
foreach (UIElement child in canvas.Children)
if (child is Path path)
{
path.Data.Transform = transform;
context.DrawGeometry(Brushes.Black, new Pen(Brushes.Black, 1), path.Data);
}
}