Итак, чтобы Для достижения своих целей я создал новый DrawingVisual, нарисовал свои изображения к этому визуальному элементу и применил эффект к указанному визуальному элементу, и все это выглядело великолепно. Однако, чтобы мои элементы управления рисовали изображение, мне нужно запустить его через RenderTargetBitmap, который сводит на нет мой пользовательский эффект, поскольку он не отображает эффекты, скомпилированные в Shader Model 3 или выше.
Мой вопрос кипит. вплоть до этого:
- Есть ли способ заставить встроенный OnRender DrawingContext рисовать другое изображение контекста, не передавая его через RenderTargetBitmap? Может быть, есть способ скомпилировать несколько контекстов рисования без предварительного преобразования их в изображения? Мне известны группы рисования, но я не знаю, как их использовать с OnRender.
Все на .Net Framework 4.7.2, если это имеет значение.
public class CustomControl : FrameworkElement
{
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
DrawingVisual drawingVisual = new DrawingVisual();
// Retrieve the DrawingContext in order to create new drawing content.
DrawingContext drawingVisualContext = drawingVisual.RenderOpen();
// Create a rectangle and draw it in the DrawingVisual.
Rect rect = new Rect(new Point(0, 0), new Size(200, 400));
drawingVisualContext.DrawRectangle(Brushes.LightBlue, null, rect);
// Persist the visual's content.
drawingVisualContext.Close();
// Note: using the built in Blur or DropShadow effects will work fine. Specifically, to
// reproduce, youll need a custom effect that is complied in Shadermodel 3 or later.
// To obtain a custom effect you will need to build one yourself or look into Shazzam
// (https://github.com/JohanLarsson/Shazzam) - an old tool I specifically use to create
// custom effects
drawingVisual.Effect = new CustomEffect();
//drawingVisual.Effect = new BlurEffect() { Radius = 25 };
// This will remove our custom effect since it uses software rendering afaik, which Shader
// Model 3 cannot be rendered with
RenderTargetBitmap bitmap = new RenderTargetBitmap((int)200, (int)400, 96, 96, PixelFormats.Default);
bitmap.Render(drawingVisual);
drawingContext.DrawImage(bitmap, rect);
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... und-for-dy