Непонятное поведение при рисовании WPF - PullRequest
0 голосов
/ 05 февраля 2010

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

1 Ответ

0 голосов
/ 05 февраля 2010

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

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

Перед рендерингом вам, вероятно, нужно вызвать некоторую комбинацию Measure / Arrange.

...