Вопрос по rendering, wpf, image, visualbrush, wpf-controls – Визуальная кисть с использованием элемента управления, который не отображается?

1

я играю с идеей в данный момент, и ямы врезались в кирпичную стену. Я'Я использую консольное приложение для создания визуального элемента управления (точнее DevCart ControlControl) в памяти, яЗатем я пытаюсь сохранить этот элемент управления в изображение, используя VisualBrush, но он выигралне работает, потому что (я предполагаю) контроль нетянул к экрану. Я

Выложите мой код ниже, чтобы вы знали, где я сейчас нахожусь. Кто-нибудь знает, как я мог бы сохранить этот элемент управления в изображение (в идеале jpg, но что-нибудь подойдет ...) с помощью консольного приложения? Я действительно нене нужно отображать его на экране даже в течение миллисекунды, чтобы сохранить его ...

static void sl_CreateDetail(FrameworkElement chartControl1, CreateAreaEventArgs e)
{
        var brush = new VisualBrush(chartControl1);
        var visual = new DrawingVisual();
        DrawingContext context = visual.RenderOpen();

        context.DrawRectangle(brush, null,
            new Rect(0, 0, chartControl1.ActualWidth, chartControl1.ActualHeight));
        context.Close();

        var bmp = new RenderTargetBitmap((int)chartControl1.ActualWidth,
            (int)chartControl1.ActualHeight, 96, 96, PixelFormats.Pbgra32);

        bmp.Render(visual);
        e.Data = bmp;
}

Ваш Ответ

2   ответа
0

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

Нет необходимости в VisualBrush и DrawingVisual, вы можете напрямую отобразить элемент управления в RenderTargetBitmap.

chartControl1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
chartControl1.Arrange(new Rect(0, 0, chartControl1.Width, chartControl1.Height));
chartControl1.UpdateLayout();

var bmp = new RenderTargetBitmap((int)chartControl1.ActualWidth,
    (int)chartControl1.ActualHeight, 96, 96, PixelFormats.Pbgra32);

bmp.Render(chartControl1);

Если элемент управления вычисляет предпочтительный размер во время макета (в мере), вы можете использовать егоDesiredSize свойство для рендеринга.

chartControl1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
chartControl1.Arrange(new Rect(new Point(), chartControl1.DesiredSize));
chartControl1.UpdateLayout();

Обратите внимание, что поток рендерингаApartmentState должно бытьSTA, В консольном приложении вы можете просто применитьSTAThread атрибут основного метода.

[STAThread]
static void Main(string[] args)
{
    ...
}
Я сделал Измерение / Аранжировать, и это нет работа. У меня уже был материал по теме STA. Мне пришлось быстро изменить свой подход, чтобы что-то работало для небольшой демонстрации. Я'Я вернусь к моему подходу и опробую ваше полное предложение как можно скорее (в ближайшие несколько дней). Faraday
0

Arrange () и т. Д., Затем обнаружил, что они работают, если у Visual есть родитель! В моем случае я удалял Visual из одного контейнера, обновлял его свойства (цвет и т. Д.), А затем пытался использовать его как VisualBrush, и это не былоT обновляется. Оставив его в исходном контейнере на время Measure () и Arrange () исправили его (хотя все это было сделано за кадром).

Похожие вопросы