В настоящее время я пытаюсь сохранить холст в растровом изображении, и я столкнулся с каким-то очень своеобразным поведением. Исходный код для 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);
}
}
}
}
спасибо. «Мелодия звонка» ничего не изменила, но «Аранж», похоже, сделал трюк. –