mardi 27 mai 2014

c# - événement Custom Control ne fonctionne ne pas - Stack Overflow


I created a custom button that have hover / click effect. I dont know why mouse events not working with this. Overriden event handlers in class definition still works.


Here is XAML of custom control:


<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>


Add control to main window:


<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>

Event:


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



In such cases, try using PreviewMouseDown event instead of MouseDown.


Preview events are raised before normal (routed) events in WPF, and many things can suppress the later. The suppression can come from many places, but you can almost always be sure that you can handle a Preview event.



I created a custom button that have hover / click effect. I dont know why mouse events not working with this. Overriden event handlers in class definition still works.


Here is XAML of custom control:


<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>


Add control to main window:


<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>

Event:


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


In such cases, try using PreviewMouseDown event instead of MouseDown.


Preview events are raised before normal (routed) events in WPF, and many things can suppress the later. The suppression can come from many places, but you can almost always be sure that you can handle a Preview event.


0 commentaires:

Enregistrer un commentaire