开发者

passing a vector drawing to the UI thread

Is there any way to draw actual WPF vectorgraphics (DrawingContext, VisualBrush, DrawingBrush, RenderTargetBitmap etc.) with Freezables in a separate thread offscreen?

The following solution almost has it, excpet that the drawing is a bitmap and is not scalable when this.label becomes big you'll the the pixels.

private void Draw()
{
    this.dispatcher = Dispatcher.CurrentDispatcher;
    Thread t = new Thread(this.DrawAsync);
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
}

private void DrawAsync(object state)
{
    var b1 = new Button
        {
            Width = 50, 
            Height = 50, 
            Content = new TextBlock
                {
                    FontSize = 16, FontFamily = new FontFamily("Arial"), FontWeight = FontWeights.Bold, Text = "Hello"
                }
        };
    b1.Measure(new Size(50, 50));
    b1.Arrange(new Rect(0, 0, 50, 50));
    PixelFormat pixelFormat = PixelFormats.Default;
    var elementBrush = new VisualBrush(b1);
    var visual = new DrawingVisual();
    using (var dc = visual.RenderOpen())
    {
        // preferably I'd like to draw controls too, but shapes and text would suff开发者_StackOverflow中文版ice too
        dc.DrawRectangle(elementBrush, null, new Rect(0, 0, 50, 50));
        dc.DrawEllipse(Brushes.Green, new Pen(Brushes.Black, 2), new Point(75, 25), 25, 15);
        dc.Close();
    }

    var bitmap = new RenderTargetBitmap(100, 50, 96, 96, pixelFormat);
    bitmap.Render(visual);
    bitmap.Freeze();
    var br = new ImageBrush(bitmap) { Stretch = Stretch.Uniform };
    br.Freeze();
    this.dispatcher.Invoke((ThreadStart)delegate { this.label.Background = br; });
}        


You could use DrawingImage which is a type of freezeable. Load or fill it in a BackgroundWorker, freeze it and pass it to an Image in the Completed Event.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜