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

  • 问题

  • 问题描述
    使用图片作为按钮显示,无边框,图片中存在大量的透明区域,目前鼠标在透明区域也会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>
    2009年9月28日 6:40

答案

  • 楼主你好,
     -->问题是我现在在wpf中没有思路如何进入到整个route中
    你是说如何调用MouseEnter事件吗?RaiseEvent方法可以触发事件。 谢谢。
    Jim Zhou -MSFT
    2009年9月30日 7:58
    版主

全部回复

  • 楼主你好,
    -->请问如何可以根据当前点是否透明来判断Hover,而不是默认的矩形区域。
    根据我的经验,以图片中是否透明来触发Hover触发器似乎行不通. 这个"透明"本身就没有一个标准,怎么样才算"透明"了呢?但是我们想要Button中某一部分不触发Hover触发器是可以的,就是把元素的IsHitTestVisible属性设为false,这样这个元素就不会用户进行交互了.
    Code:

    <Window.Resources>

            <Style TargetType="Button" >

                <Setter Property="Template">

                    <Setter.Value>

                        <ControlTemplate TargetType="Button">

                            <StackPanel Orientation="Horizontal" >

                                <Image Source="C:/apple.jpg"/>

                                <Label Content="Disabled"

                                       Width=" 200"

                                       Background="LightBlue"

                                       IsHitTestVisible="False" />

                            </StackPanel>

                            <ControlTemplate.Triggers>

                                <Trigger Property="IsMouseOver" Value="True">

                                    <Setter Property="Button.Opacity" Value="0.3"></Setter>

                                </Trigger>

                            </ControlTemplate.Triggers>

                        </ControlTemplate>

                    </Setter.Value>

                </Setter>

            </Style>

        </Window.Resources>

        <Button Height="100"

                Canvas.Left="258"

                Canvas.Top="183"

                 ></Button>

    谢谢.


    Jim Zhou -MSFT
    2009年9月29日 6:24
    版主
  • 如果安装winform/w32的机理来看考虑,就是我hook mousemove msg,然后判断当前映射图片的point,然后取出ARGB,如果A=FF,RGB为0时,则认为cancel hover,反之触发hover.
    问题是我现在在wpf中没有思路如何进入到整个route中。请指教。
    2009年9月29日 7:12
  • 楼主你好,
     -->问题是我现在在wpf中没有思路如何进入到整个route中
    你是说如何调用MouseEnter事件吗?RaiseEvent方法可以触发事件。 谢谢。
    Jim Zhou -MSFT
    2009年9月30日 7:58
    版主