2013-09-25 3 views
1

У меня есть SVG-графический объект, который представляет собой квадрат 264x264 в центре окна просмотра 400x400, и что 68 пикселей прокладки вокруг квадрата являются важной частью изображения, я хочу, чтобы это отображалось в WPF. Я использую библиотеку для преобразования SVG рисования в WPF DrawingImage, а выход после того, как я переполнена его в страницу, чтобы просмотреть это выглядит следующим образом:Как предотвратить WPF от обрезки моей векторной графики?

<Page x:Class="Page1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
    d:DesignHeight="400" d:DesignWidth="400" 
Title="Page1"> 

<Image> 
    <Image.Source> 
     <DrawingImage> 
      <DrawingImage.Drawing> 
       <DrawingGroup xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:svg="http://sharpvectors.codeplex.com/runtime/"> 
        <DrawingGroup.Children> 
         <DrawingGroup> 
          <DrawingGroup.Children> 
           <DrawingGroup> 
            <DrawingGroup.Children> 
             <DrawingGroup> 
              <DrawingGroup.Children> 
               <GeometryDrawing Brush="#FFAAFFAA"> 
                <GeometryDrawing.Pen> 
                 <Pen Brush="#FF000000" Thickness="10" StartLineCap="Flat" EndLineCap="Flat" LineJoin="Miter" /> 
                </GeometryDrawing.Pen> 
                <GeometryDrawing.Geometry> 
                 <RectangleGeometry RadiusX="0" RadiusY="0" Rect="68,68,264,264" /> 
                </GeometryDrawing.Geometry> 
               </GeometryDrawing> 
              </DrawingGroup.Children> 
              <DrawingGroup.ClipGeometry> 
               <RectangleGeometry Rect="0,0,400,400" /> 
              </DrawingGroup.ClipGeometry> 
              <DrawingGroup.Transform> 
               <TranslateTransform X="0" Y="0" /> 
              </DrawingGroup.Transform> 
             </DrawingGroup> 
            </DrawingGroup.Children> 
           </DrawingGroup> 
          </DrawingGroup.Children> 
          <DrawingGroup.ClipGeometry> 
           <RectangleGeometry Rect="0,0,400,400" /> 
          </DrawingGroup.ClipGeometry> 
         </DrawingGroup> 
        </DrawingGroup.Children> 
       </DrawingGroup> 
      </DrawingImage.Drawing> 
     </DrawingImage> 
    </Image.Source> 
</Image> 
</Page> 

Полученное изображение представляет собой квадрат, который полностью заполняет его контейнер, вместо того, чтобы оставлять вокруг него пустое пространство, как я хочу. Как получить WPF, чтобы сохранить это пространство, а не обрезать его?

ответ

0

Когда вы используете DrawingImage, пустое пространство игнорируется/обрезается при рендеринге Image. Это сообщение обсуждает ту же проблему: Why is a GeometryDrawing displayed on Canvas with clipped coordinates?

Вы можете добиться того, что вы хотите, рисуя пустое пространство в виде прозрачного прямоугольника 400x400 позади зеленого прямоугольника:

... 
<DrawingGroup> 
    <DrawingGroup.Children> 

     <!-- Added transparent "spacer": --> 
     <GeometryDrawing Brush="Transparent"> 
      <GeometryDrawing.Geometry> 
       <RectangleGeometry RadiusX="0" RadiusY="0" Rect="0,0,400,400" /> 
      </GeometryDrawing.Geometry> 
     </GeometryDrawing> 

     <!-- This was here before: --> 
     <GeometryDrawing Brush="#FFAAFFAA"> 
      <GeometryDrawing.Pen> 
       <Pen Brush="#FF000000" Thickness="10" 
        StartLineCap="Flat" EndLineCap="Flat" LineJoin="Miter" /> 
      </GeometryDrawing.Pen> 
      <GeometryDrawing.Geometry> 
       <RectangleGeometry RadiusX="0" RadiusY="0" Rect="68,68,264,264" /> 
      </GeometryDrawing.Geometry> 
     </GeometryDrawing> 
     ... 
+1

работает как шарм! Для тех из вас, кто использует одну и ту же конверсионную библиотеку (SharpVectors, New BSD license), довольно просто изменить свой вывод, чтобы создать для вас эти прозрачные прямоугольники. Внутри оператора if, начинающегося с WpfSvgRendering.cs в строке 140 (предполагая, что sharpvectors-24484.zip - ваш исходный пакет), для каждой 'drawGroup.ClipGeometry = new RectangleGeometry ([некоторый экземпляр Rectangle]);' добавить '_drawGroup.Children .Insert (0, новый GeometryDrawing() {Brush = Brushes.Transparent, Geometry = new RectangleGeometry ([некоторый экземпляр Rectangle])}); 'на следующей строке – user2816684

Смежные вопросы