2014-04-04 91 views
0

我創建了一個具有懸停/點擊效果的自定義按鈕。我不知道爲什麼鼠標事件不適用於此。類定義中的Overriden事件處理程序仍然有效。自定義控件事件不起作用

這裏是自定義控件的XAML:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:CSOCodeBox_WPF"> 

<Style TargetType="{x:Type local:HoverButton}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:HoverButton}"> 
       <Rectangle x:Name="btnImage" HorizontalAlignment="Left" VerticalAlignment="Top" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"> 
        <Rectangle.Fill> 
         <ImageBrush ImageSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Image}"/> 
        </Rectangle.Fill> 
       </Rectangle> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter TargetName="btnImage" Property="Fill"> 
          <Setter.Value> 
           <ImageBrush ImageSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HoverImage}"/> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
        <Trigger Property="IsMouseCaptured" Value="True"> 
         <Setter TargetName="btnImage" Property="Fill"> 
          <Setter.Value> 
           <ImageBrush ImageSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PressImage}"/> 
          </Setter.Value> 
         </Setter> 
        </Trigger>       
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

添加控制主窗口:

<my:HoverButton x:Name="hoverButton1" Width="201" Height="121" Canvas.Left="235" Canvas.Top="500" Image="/CSOCodeBox_WPF;component/GFX/Button_None.png" HoverImage="/CSOCodeBox_WPF;component/GFX/Button_Ready.png" PressImage="/CSOCodeBox_WPF;component/GFX/Button_Clicking.png" MouseDown="hoverButton1_MouseDown_1"></my:HoverButton> 

事件:

 private void hoverButton1_MouseDown_1(object sender, MouseButtonEventArgs e) 
    { 
     MessageBox.Show("Button clicked"); 
    } 

回答

1

在這種情況下,嘗試使用PreviewMouseDown事件i而不是MouseDown。

預覽事件在WPF中的正常(路由)事件之前引發,並且很多事情可以抑制後者。壓制可能來自許多地方,但幾乎總是可以確保您可以處理預覽事件。

+0

謝謝,它的工作;) –

+0

Btw什麼會壓制路由事件? –

+0

@BienPham我可以直接說的是,這兩種類型不是獨立的。首先,諸如PreviewMouseDown之類的隧道(預覽)事件首先被觸發,並且在隧穿時,這可以被抑制。但是,如果隧道事件設法觸發源對象,冒泡(正常)事件(如MouseDown)將從源中觸發並流向頂層元素(Window)。 至於什麼會抑制事件,你的層次結構中的一些元素可能是原因。但你總是可以處理隧道事件。 :) – mrahhal