在用PNG作为一个Button的时候,如何能控制Hover区域?

nonocast 2009-09-28 10:28:18
问题描述
使用图片作为按钮显示,无边框,图片中存在大量的透明区域,目前鼠标在透明区域也会trigger hover事件;
请问如何可以根据当前点是否透明来判断Hover,而不是默认的矩形区域。
谢谢。

Button的样式如下

<Style TargetType="Button" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Image Source="Images/tel256.png"/>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Button.Opacity" Value="0.3"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>


使用过程

<Button Height="50" Canvas.Left="258" Canvas.Top="183" Width="50"></Button>

谢谢了
...全文
107 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
nonocast 2009-09-29
  • 打赏
  • 举报
回复
没理解这个CheckHover放在哪里?
override 还是hook event?给点提示,谢谢啊


PS.你这个检测有点过分嘛
public static Color getImagePointColor(BitmapSource bitmapsource, int x, int y) {
CroppedBitmap crop = new CroppedBitmap(bitmapsource as BitmapSource, new Int32Rect(x, y, 1, 1));
byte[] pixels = new byte[4];
try {
crop.CopyPixels(pixels, 4, 0);
crop = null;
} catch (Exception ee) {
MessageBox.Show(ee.ToString());
}
//蓝pixels[0] 绿pixels[1] 红pixels[2] 透明度pixels[3]
return Color.FromArgb(pixels[3], pixels[2], pixels[1], pixels[0]);
}

that's ok.
jv9 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nonocast 的回复:]
应付当然是没问题,只是想知道怎么处理这个问题。

http://www.cnblogs.com/alamiye010/archive/2009/07/11/1521418.html
这里有说到,但我没看太明白怎么具体解决我这个问题。
[/Quote]

他的这个是根据他的游戏项目,太复杂了。
jv9 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nonocast 的回复:]
应付当然是没问题,只是想知道怎么处理这个问题。

http://www.cnblogs.com/alamiye010/archive/2009/07/11/1521418.html
这里有说到,但我没看太明白怎么具体解决我这个问题。
[/Quote]

写了一个代码,你可以参考一下,使用hittest可以这样实现。



private bool CheckHover(FrameworkElement control1, FrameworkElement controlElem1, FrameworkElement control2, FrameworkElement controlElem2)

{

// 建立一个矩形

Rect rect1 = UserControlBounds(control1);

Rect rect2 = UserControlBounds(control2);





rect1.Intersect(rect2);

if (rect1 == Rect.Empty)

{
//鼠标不在矩形中
return false;

}

else

{

bool bCollision = false;

Point ptCheck = new Point();



// 设置pixel进行hittest

for (int x = Convert.ToInt32(rect1.X); x < Convert.ToInt32(rect1.X + rect1.Width); x++)

{

for (int y = Convert.ToInt32(rect1.Y); y < Convert.ToInt32(rect1.Y + rect1.Height); y++)

{

ptCheck.X = x;

ptCheck.Y = y;



List<UIElement> hits = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(ptCheck, control1) as List<UIElement>;

if (hits.Contains(controlElem1))

{

// 模拟hittest

List<UIElement> hits2 = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(ptCheck, control2) as List<UIElement>;

if (hits2.Contains(controlElem2))

{

bCollision = true;

break;

}

}

}

if (bCollision) break;

}

return bCollision;

}





}


jv9 2009-09-29
  • 打赏
  • 举报
回复
是有一些复杂。

调用起来很简单。


void CompositionTarget_Rendering(object sender, EventArgs e)
{

Path shipShell = ship.FindName("ShipShell") as Path;
Path pathAsteroid1 = asteroidXaml1.FindName("pathAsteroid") as Path;

if (CheckHover(ship, shipShell, asteroidXaml1, pathAsteroid1))
{
txtStatus.Text = "鼠标Hover事件";
return;
}

txtStatus.Text = string.Empty;


}

nonocast 2009-09-28
  • 打赏
  • 举报
回复
应付当然是没问题,只是想知道怎么处理这个问题。

http://www.cnblogs.com/alamiye010/archive/2009/07/11/1521418.html
这里有说到,但我没看太明白怎么具体解决我这个问题。
jv9 2009-09-28
  • 打赏
  • 举报
回复
我想应该不能使用代码的方法修改hover区域。Silverlight2有过热点区域的概念,但是我看了,不能实现你的要求。

是不是可以尝试把图片修改一下,减少空白区域呢?

8,737

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧