System.Windows.Media.DrawingContext.DrawImage() 在阴影等半透明区域显示白色像素而不是黑色像素

System.Windows.Media.DrawingContext.DrawImage() showing white pixels instead of black in semi-transparent areas like shadows

我有一个 WPF Button 子类,它重写 OnRender() 以根据当前状态绘制多个位图之一。简化的(1 位图)代码如下所示...

    protected override void OnRender(DrawingContext context)
    {
        context.DrawImage(_MyBitmapSource, new Rect(0, 0, Width, Height));
    }

每个位图中阴影的半透明黑色像素错误地呈现为半透明白色。

同样,如果我将这些图像之一设置为背景画笔,同样的事情也会发生。

对于 Image 控件,将相同的图像设置为 Source 看起来是正确的,所以我知道 WPF 能够正确绘制阴影。我显然遗漏了一些东西 — 可能是在调用 DrawImage() 之前需要在 OnRender() 中设置的其他东西。

PNG 图像没有什么特别之处。为了确定这不是问题,我从 images.google.com 下载了一些 PNG,它们都有同样的问题。

在其他框架中,Paint 或 Render 等事件通常用于更改控件的外观。

WPF 具有无外观控件 - 您可以将 wpf 控件模板化为您能想象到的任何东西。这相当令人麻木,非常强大,并且使某些事情比在其他框架中更容易。

因此,"conventional" wpf 创建具有按钮行为的图像的方法只是将按钮的模板设置为图像。然后您可以通过代码或标记设置图像源。 Markkup 通常是 WPF 开发人员的首选,您有多种选择,包括数据触发器、触发器、模板和视觉状态。

这种方法的其他好处是标记使您可以立即了解将要发生的事情,并且您可以相当轻松地简化它以解决任何问题。