【问题标题】:passing a vector drawing to the UI thread将矢量图传递给 UI 线程
【发布时间】:2011-09-15 09:44:25
【问题描述】:

有没有办法在屏幕外的单独线程中使用 Freezables 绘制实际的 WPF 矢量图形(DrawingContext、VisualBrush、DrawingBrush、RenderTargetBitmap 等)?

以下解决方案几乎有它,除了绘图是位图并且当this.label变大时无法缩放像素。

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 suffice 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; });
}        

【问题讨论】:

    标签: wpf graphics asynchronous


    【解决方案1】:

    您可以使用DrawingImage,这是一种可冻结的类型。将其加载或填充到 BackgroundWorker 中,将其冻结并在 Completed Event 中将其传递给 Image。

    【讨论】:

    • 一旦我使用 VisualBrush 绘制控件,就像在我的问题中的示例中一样,我无法再冻结 DrawingImage。有办法解决吗?
    • 毫无疑问,所有控件都必须在 UI 线程中创建。即使它们只是在屏幕外创建,一旦您尝试创建它,它也会引发异常。这是一个耻辱,但就是这样。但是,虚拟化还有其他方面的帮助,具体取决于您想做的事情的原因。
    猜你喜欢
    • 2023-02-06
    • 2021-02-08
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 2011-02-18
    相关资源
    最近更新 更多