使用DrawingContext绘制视图框

时间:2014-09-03 12:56:04

标签: wpf xaml icons viewbox

我正在编写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

1 个答案:

答案 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);
           }
}