0

Никак не могу отрисовать в фоне визуальное дерево WPF (приходится делать вьюшки, с последующим их отражением) - это не удобно, видно как окно моментально появляется и исчезает.

        private static byte[] GetPNG<T>(INotifyPropertyChanged viewModel)
            where T : Window, new()
        {
            var wnd = new T()
            {
                DataContext = viewModel
            };
            wnd.Show();
        var content = (FrameworkElement)wnd.Content;

        var rtb = new RenderTargetBitmap((int)content.ActualWidth, (int)content.ActualHeight, 96d, 96d, PixelFormats.Default);
        rtb.Render(content);

        BitmapEncoder pngEncoder = new PngBitmapEncoder();
        pngEncoder.Frames.Add(BitmapFrame.Create(rtb));

        using var ms = new MemoryStream();

        pngEncoder.Save(ms);

        wnd.Close();

        return ms.ToArray();
    }

На данный момент только так...

Может у кого-нибудь есть решение - или знает способ отрисовки в памяти без помещения компонента в визуальное дерево?

Pekor
  • 449
  • Можете объяснить суть, вы скриншот окна таким образом рисуете чтоли? Или как это понимать? Что вообще происходит, зачем это делать? Возмите GDI+ (System.Drawing), нарисуйте на битмапе все что хотите, и готово. Тоже своего рода вьюха. А так, задайте окну координаты за рамками монитора, например -10000, -10000, выключите ему отображение в таскбаре и негативный эффект от всплывающего окна не будет вас беспокоить. – aepot May 25 '22 at 19:04
  • Кстати, если вьюхи хранить в шаблонах в ресурсах, а не в окнах, то у этого метода можно будет избавиться от обобщения. Просто использовать какое-то одно специальное окно для этого. Это на случай, если вам нужна скорость, то можно будет окно-синглтон не пересоздавать, а скрывать/показывать, подменяя ему вьюмодель. – aepot May 25 '22 at 19:18
  • https://docs.microsoft.com/en-us/dotnet/desktop/wpf/graphics-multimedia/how-to-encode-a-visual-to-an-image-file в документации кстати без окна процесс делается. А вот здесь обратите внимание на фокус в arrange/measure. – aepot May 25 '22 at 19:29
  • Основная задача отрисовать в фоне элемент интерфейса собранного в XAML, я так не умею Графические примитивы рисовать могу в GDI+, шейдеры писать могу, и все другое. Нужно именно XAML (в моем случае, пробежаться по визуальному дереву WPF). Вот не могу заставить (вернее не знаю как):
    1. задать layout (для задания ширины и автоматического расчета высоты, которая может быть разной);
    2. выполнить updatelayout элемента который не помещен в отображаемое визуальное дерево.

    Все мои фоновые варианты не имеют размера Size(0,0) и соответственно png черная

    – Fapser Faps May 26 '22 at 11:09
  • Воспроизводимый пример бы получить. Тема не популярная, на уровне кода мало что можно придумать. Надо трогать и играться. – aepot May 26 '22 at 18:03
  • Увы весь проект не могу скинуть. Вечером, если будет время, шаблон накидаю. – Fapser Faps May 27 '22 at 10:51
  • Так проект никто и не просит, мало того, он и не нужен. Нужен минимальный воспроизводимый пример, где работает то что вам нужно. Чтобы проблема с размерами контролов там воспроизводилась так же как в вашем основном проекте – aepot May 27 '22 at 11:14

0 Answers0