передача векторного рисунка в поток пользовательского интерфейса - PullRequest
1 голос
/ 15 сентября 2011

Есть ли способ нарисовать фактическую векторную графику WPF ( DrawingContext , VisualBrush, DrawingBrush, RenderTargetBitmap и т. Д.) С Freezables в отдельном потоке вне экрана?

Следующее решение почти имеет его, за исключением того, что рисунок является растровым и не масштабируется, когда 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; });
}        

1 Ответ

1 голос
/ 15 сентября 2011

Вы можете использовать DrawingImage , который является типом freezeable.Загрузите или заполните его в BackgroundWorker, заморозьте и передайте его изображению в завершенном событии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...