2014-04-04 3 views
0

Я создал пользовательскую кнопку с эффектом зависания/щелчка. Я не знаю, почему события мыши не работают с этим. Overrideen обработчики событий в определении класса все еще работают.Нестандартное управление событие

Вот 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, и многие вещи могут подавлять позже. Подавление может происходить из многих мест, но вы почти всегда можете быть уверены, что можете обрабатывать событие Preview.

+0

Спасибо, это сработало;) –

+0

Btw, что бы подавить разгромленные события? –

+0

@BienPham Я могу сказать прямо, что эти два типа не являются независимыми. Во-первых, сначала запускается событие туннелирования (Preview), например PreviewMouseDown, и при туннелировании это может быть подавлено. Но если туннельному событию удастся добраться до исходного объекта, который его выпустил, пузырьковое (нормальное) событие, такое как MouseDown, будет срабатывать от источника и протекать до элемента верхнего уровня (Window). Что касается подавления событий, некоторые из элементов вашей иерархии могут быть причиной. Но вы всегда можете обрабатывать события туннелирования. :) – mrahhal

Смежные вопросы