В настоящее время я пытаюсь сохранить холст в растровом изображении, и я столкнулся с очень странным поведением. Исходный код для 3 следующих случаев приведен в конце поста.
Случай 1: красный прямоугольник появляется в выходном файле (test.png), как и ожидалось.
Случай 2: в выходном файле отсутствует красный прямоугольник.
Случай 3: в выходном файле не отображается красный прямоугольник.
Кажется, что добавление прямоугольника к холсту (даже если этот холст никогда не используется для рендеринга прямоугольника на диск) необходимо. Также кажется, что нажатие кнопки должно инициировать рисование - что это не может произойти в конструкторе Window. Ничто из этого не имеет смысла для меня, и я предполагаю, что что-то неправильно понимаю.
Кроме того, заранее извиняюсь за плохое форматирование кода. Я боролся с этим в течение 20 минут, но теперь я сдаюсь.
Заранее спасибо,
- Брек Фрезен
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);
}
}
}
}