2014-02-10 6 views
0

Я пытаюсь внедрить инструмент заливки заливки в программу рисования WPF. Я пытаюсь обойти любой из векторных методов, убедившись, что каждое действие рисования сначала записывается в растровое изображение. Затем растровое изображение устанавливается на холст.Добавление изображения

У меня проблема при передаче изображения на холст. Он не устанавливает изображение, используя относительное положение. Изображения объяснят намного лучше, чем я могу.

Перед Заливка:

Before Fill

После заливки:

enter image description here

Изображение растровое изображение записывается по отношению к окну и перекрывает панель инструментов. Мне интересно, как я могу предотвратить это. Прикреплен соответствующий код из моего класса Fill.

public override void OnMouseDown(CCDrawingCanvas canvas, System.Windows.Input.MouseButtonEventArgs e) { 
     double dpi = 96d; 

     // Get the size of the canvas 
     System.Windows.Size size = new System.Windows.Size((int)canvas.ActualWidth, (int)canvas.ActualHeight); 

     // Measure and arrange the surface 
     canvas.Measure(size); 
     canvas.Arrange(new Rect(size)); 

     RenderTargetBitmap source = new RenderTargetBitmap(
      (int)canvas.ActualWidth, 
      (int)canvas.ActualHeight, 
      dpi, 
      dpi, 
      PixelFormats.Pbgra32); 
     source.Render(canvas); 

     WriteableBitmap modifiedImage = new WriteableBitmap(source); 
     int h = modifiedImage.PixelHeight; 
     int w = modifiedImage.PixelWidth; 
     int[] pixelData = new int[h * w]; 
     int widthInByte = modifiedImage.PixelWidth * (modifiedImage.Format.BitsPerPixel/8); 

     modifiedImage.CopyPixels(pixelData, widthInByte, 0); 

     int oldColor = BitConverter.ToInt32(new byte[] { System.Drawing.Color.White.B, System.Drawing.Color.White.G, System.Drawing.Color.White.R, System.Drawing.Color.White.A }, 0); 
     int newColor = BitConverter.ToInt32(new byte[] { System.Drawing.Color.Black.B, System.Drawing.Color.Black.G, System.Drawing.Color.Black.R, System.Drawing.Color.Black.A }, 0); 

     // Perform the recursive fill 
     FloodFill(pixelData, (int)p.X, (int)p.Y, w, h, oldColor, newColor); 

     modifiedImage.WritePixels(new Int32Rect(0, 0, w, h), pixelData, widthInByte, 0); 

     newFill = new GraphicsFill(modifiedImage); 

     // Adds newFill to canvas.GraphicsList 
     AddObject(canvas, newFill); 

    } 

XAML Код:

<Window x:Class="ccGui.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:effects="clr-namespace:System.Windows.Media.Effects;assembly=presentationcore" 
    xmlns:lib="clr-namespace:ccDrawingLib;assembly=ccDrawingLib" 
    xmlns:local="clr-namespace:ccGui" 
    Title="MainWindow" Height="600" Width="800"> 

<DockPanel> 
    <Menu DockPanel.Dock="Top"> 
     <MenuItem Header="File"> 
      <MenuItem Header="New" Command="ApplicationCommands.New" /> 
      <MenuItem Header="Open" Command="ApplicationCommands.Open" /> 
      <MenuItem Header="Save" Command="ApplicationCommands.Save" /> 
      <MenuItem Header="Save As" Command="ApplicationCommands.SaveAs" /> 
      <MenuItem Header="Close" Command="ApplicationCommands.Close" /> 
     </MenuItem> 
     <MenuItem Header="Tool" Name="menuTools"> 
      <MenuItem Header="Brush" Name="ccToolBrush" Tag="Brush" /> 
      <MenuItem Header="Fill" Name="ccToolFill" Tag="Fill" /> 
     </MenuItem> 
    </Menu> 
    <lib:CCDrawingCanvas x:Name="canvas" Background="White" /> 
</DockPanel> 
</Window> 
+1

Симптомы почти похожи на то, что новый объект добавляется к родительскому или корневому Visual вместо ребенка. Как правило, система компоновки обычно предотвращает несогласованные макеты, если вы действительно не пытаетесь или не добавили неправильный родительский визуал/контейнер. Можете ли вы поделиться соответствующим XAML тоже? –

+1

Зачем делать все это вручную, когда вы можете просто использовать классы фигур и сохранять изображение с помощью ['RenderTargetBitmap.Render'] (http://msdn.microsoft.com/en-us/library/system .windows.media.imaging.rendertargetbitmap.render.aspx) Метод? – Sheridan

+0

@JTrana Я отправлю его в ближайшее время. – Alex

ответ

1

В WPF, практически все элементы управления пользовательского интерфейса расширить Visual класс. Вы можете использовать ссылку Visual, чтобы перейти к RenderTargetBitmap.Render Method, чтобы легко сохранить изображение этого элемента управления пользовательского интерфейса. Мне кажется, что вам не нужно продолжать переключение между Shape и BitMapImage s, чтобы заполнить ваши Shape s. Я предполагаю, что при рисовании фигур вы используете Path. Если это так, то вы можете просто использовать свойство Path.Fill, чтобы заполнить его, не делая никаких ручных вычислений.

Кроме того, если вы устанавливаете Panel.Zindex Attached Property на каждую новую фигуру и каждый раз используете следующее значение выше Zindex, то последние фигуры всегда будут располагаться поверх нижних, как в стандартной программе рисования. Вы можете даже включить пользователей для переключения слоев формы их рисунка с использованием этого свойства.

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