WPF中不规则的PNG按钮的单击事件

在WPF中我需要一个不规则形状的按钮。 我是这样用XAML做的:

  

我的ball.png图片是一张PNG图片,周围有一个透明区域的球。 该按钮显示正确,但即使我克隆图像的透明部分,也会执行Click事件处理程序。

有没有办法使用透明PNG创建不规则按钮?

谢谢,迈克尔

您可以创建一个inheritance自Image并重写HitTestCore的类,以便它不响应图像透明部分的命中测试,然后在模板中使用该类而不是普通图像。

这是一个例子,虽然检查透明像素的代码不是很强大,因为它对图像源和像素格式做了一些假设。 如果您已经有代码来检查透明像素,那么您应该将其插入。

 public class TransparentImage : Image { protected override HitTestResult HitTestCore( PointHitTestParameters hitTestParameters) { // Get value of current pixel var source = (BitmapSource)Source; var x = (int)(hitTestParameters.HitPoint.X / ActualWidth * source.PixelWidth); var y = (int)(hitTestParameters.HitPoint.Y / ActualHeight * source.PixelHeight); var pixels = new byte[4]; source.CopyPixels(new Int32Rect(x, y, 1, 1), pixels, 4, 0); // Check alpha channel if (pixels[3] < 10) { return new PointHitTestResult(this, hitTestParameters.HitPoint); } else { return null; } } protected override GeometryHitTestResult HitTestCore( GeometryHitTestParameters hitTestParameters) { // Do something similar here, possibly checking every pixel within // the hitTestParameters.HitGeometry.Bounds rectangle return base.HitTestCore(hitTestParameters); } } 

Michal,我不会创建一个真正的“按钮”。 只需进行混合,将图像作为图像画笔变成矩形,右键单击使其成为按钮。 如果您使用Blend 4,这将在Visual State Manager中生成相应的状态。 您可以将鼠标hover,按下等,看起来像一个按钮。 甚至是残疾状态。

这是一个例子:

    

现在使用按钮如下:

  

我知道这不是使用透明的png作为按钮,但如果你有能力将png转换为xaml,它将是一个更好的选择。