Функция PushEffect в DrawingContext устарела. Существует ли обходной путь для динамического добавления эффектов?C#

Место общения программистов C#
Ответить
Anonymous
 Функция PushEffect в DrawingContext устарела. Существует ли обходной путь для динамического добавления эффектов?

Сообщение Anonymous »

У меня есть специальный элемент управления, предназначенный для обработки составных изображений с эффектами. Я хочу применить пользовательские эффекты шейдера к определенным элементам рендеринга этого элемента управления, но встроенные функции PushEffect и PopEffect, которые легко могли бы это сделать, устарели и ничего не делают.
Итак, чтобы Для достижения своих целей я создал новый DrawingVisual, нарисовал свои изображения к этому визуальному элементу и применил эффект к указанному визуальному элементу, и все это выглядело великолепно. Однако, чтобы мои элементы управления рисовали изображение, мне нужно запустить его через RenderTargetBitmap, который сводит на нет мой пользовательский эффект, поскольку он не отображает эффекты, скомпилированные в Shader Model 3 или выше.
Мой вопрос кипит. вплоть до этого:
  • Есть ли способ заставить встроенный OnRender DrawingContext рисовать другое изображение контекста, не передавая его через RenderTargetBitmap? Может быть, есть способ скомпилировать несколько контекстов рисования без предварительного преобразования их в изображения? Мне известны группы рисования, но я не знаю, как их использовать с OnRender.
Обратите внимание, что моя цель — сделать это в коде. позади, поэтому решения XAML не будут слишком полезны. Я также готов услышать альтернативные способы применения эффектов к конкретным элементам настраиваемого элемента управления, которые мне могут отсутствовать.
Все на .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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»