2010-02-05 3 views
0

В настоящее время я пытаюсь сохранить холст в растровом изображении, и я столкнулся с каким-то очень своеобразным поведением. Исходный код для 3 следующих случаев появляется в конце сообщения.Неверное поведение рисования WPF

Случай 1: Красный красный прямоугольник появляется в выходном файле (test.png), как и ожидалось.

Корпус 2: в выходном файле нет красного прямоугольника.

Корпус 3: в выходном файле нет красного прямоугольника.

Похоже, что добавление прямоугольника к холсту (хотя этот холст никогда не используется для визуализации прямоугольника на диск). Также кажется, что щелчок на кнопке должен инициировать рисунок - это невозможно в конструкторе Window. Ни один из них не имеет смысла для меня, и я предполагаю, что что-то не понимаю.

Кроме того, заранее извиняюсь за неправильное форматирование кода. Я боролся с ним 20 минут, но теперь я сдаюсь.

Спасибо заранее,

- Брек Fresen

Часть XAML используется для всех 3-х случаях:

<Window x:Class="ScanOutlineCreator.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="250" Width="250"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="20" /> 
       <RowDefinition /> 
      </Grid.RowDefinitions> 
      <Button x:Name="btnGo" Grid.Row="0"> 
       <TextBlock Text="Go" /> 
      </Button> 
      <Canvas Grid.Row="1" x:Name="canvas" Width="200" Height="500"></Canvas> 
     </Grid> 
</Window> 

Случай 1:

using System.IO; 
using System.Windows; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 
using Common.Drawing; 
namespace ScanOutlineCreator 
{ 
     public partial class Window1 
     { 
       static Rectangle r = new Rectangle { Width = 100, Height = 100, Fill = Brushes.Red }; 
       public Window1() 
       { 
         InitializeComponent(); 
         btnGo.Click += new RoutedEventHandler(btnGo_Click); 
         canvas.Children.Add(r); 
       } 

       static void btnGo_Click(object sender, RoutedEventArgs e) 
       { 
         using (Stream stm = File.Create("test.png")) 
         { 
           RenderTargetBitmap rtb = new RenderTargetBitmap(100, 100, 96, 96, PixelFormats.Pbgra32); 
           rtb.Render(r); 
           Util.RenderTargetBitmapToStream(rtb, stm); 
         } 
       } 
     } 
} 

Случай 2:

using System.IO; 
using System.Windows; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 
using Common.Drawing; 

namespace ScanOutlineCreator  
{  
    public partial class Window1 
    { 
     static Rectangle r = new Rectangle { Width = 100, Height = 100, Fill = Brushes.Red }; 
     public Window1() 
     { 
      InitializeComponent(); 
      btnGo.Click += new RoutedEventHandler(btnGo_Click); 
     } 

     static void btnGo_Click(object sender, RoutedEventArgs e) 
     { 
      using (Stream stm = File.Create("test.png")) 
      { 
       RenderTargetBitmap rtb = new RenderTargetBitmap(100, 100, 96, 96, PixelFormats.Pbgra32); 
       rtb.Render(r); 
       Util.RenderTargetBitmapToStream(rtb, stm); 
      } 
     } 
    } 
} 

Случай 3:

using System.IO; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 
using Common.Drawing; 
namespace ScanOutlineCreator 
{ 
    public partial class Window1 
    { 
     static Rectangle r = new Rectangle { Width = 100, Height = 100, Fill = Brushes.Red }; 
     public Window1() 
     { 
      InitializeComponent(); 
      canvas.Children.Add(r); 
      using (Stream stm = File.Create("test.png")) 
      { 
       RenderTargetBitmap rtb = new RenderTargetBitmap(100, 100, 96, 96, PixelFormats.Pbgra32); 
       rtb.Render(r); 
       Util.RenderTargetBitmapToStream(rtb, stm); 
      } 
     } 
    } 
} 

ответ

0

Это почти наверняка связан с макетом. Если так, то это было покрыто много раз.

После добавления детей, вы должны убедиться, что макет получает выполняется перед тем, как вынести, так что все на самом деле в визуальном дереве в нужном месте и т.д.

Вы, вероятно, нужно вызвать некоторую комбинацию Меры/Устрой перед рендерингом.

+0

спасибо. «Мелодия звонка» ничего не изменила, но «Аранж», похоже, сделал трюк. –