2009-05-20 12 views
3

Avez-vous déjà rencontré un problème lors de l'attribution d'un gestionnaire d'événements click pour votre contrôle personnalisé WPF avec un contrôle de bouton imbriqué? Je fais.Créer un gestionnaire d'événements de clic personnalisé pour un contrôle utilisateur WPF qui contient un bouton?

Lorsque vous placez un tel contrôle utilisateur dans une fenêtre principale, disons Main.xaml, le MouseLeftButtonDown ne fonctionne pas, mais le PreviewMouseLeftButtonDown fonctionne comme un charme. Mais imaginez-vous dire à chaque développeur de votre équipe d'utiliser cet événement lors de l'utilisation de votre contrôle utilisateur ... Certains contrôles utilisateur dans votre bibliothèque ont MouseLeftButtonDown, d'autres PreviewMouseLeftButtonDown .... C'est un gâchis n'est-ce pas?

J'ai donc une solution mais je veux que quelqu'un veuille savoir s'il existe une manière élégante de créer votre gestionnaire d'événement personnalisé appelé "Click".

Dans mon UserControl appelé CustomButton.xaml.cs, j'ai jusqu'à présent:

public partial class CustomButton: UserControl 
{ 

    public CustomButton() 
     : base() 
    { 
     this.InitializeComponent(); 

    } 

    public delegate void ClickHandler(object sender, EventArgs e); 
    public event EventHandler Click; 

    public void Button_Click(object sender, RoutedEventArgs e) {//execute daddy's button click 
      (((sender as Button).Parent as Grid).Parent as CustomButton).Click(sender, e); 

      e.Handled = false; 

    } 

Dans mon CustomButton.xaml

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
x:Class="YourCompany.UI.Controls.CustomButton" d:DesignHeight="72.5" d:DesignWidth="200"> 
<UserControl.Resources> 
blablabla 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot"> 
    <Button Style="{DynamicResource CustomButton}" 
      Width="{Binding ElementName=CustomButton, Path=ActualWidth}" 
      Cursor="Hand" Foreground="#ffffff" FontSize="28" Margin="8,8,0,12" 
      HorizontalAlignment="Left" 
      Content="Custom Button" Click="Button_Click" /> 


</Grid> 

Maintenant, dans mon Main.xaml, la l'appelant, j'ai:

<Window x:Class="YourCompany.MyProject.Main" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="MyProject!" Height="600" Width="800" 
MinWidth="800" MinHeight="600" WindowState="Maximized" WindowStartupLocation="CenterScreen" 
xmlns:bigbola="clr-namespace:YourCompany.UI.Controls;assembly=YourCompany.UI.Controls"> 

<mycontrols:CustomButton Name="test" MyImage=".\Images\btnOptions.png" Cursor="Hand" 
      Texto="See options" Click="test_Click" 
      Margin="168.367,176.702,253.609,0" ToolTip="See all options" Height="76.682" 
      VerticalAlignment="Top"></mycontrols:CustomButton> 

Explication:

Dans le contrôle usercontrol, lorsque vous cliquez sur le bouton imbriqué, il exécute son gestionnaire "Click" personnalisé parent.

Existe-t-il une manière élégante d'accomplir le même effet?

Répondre

3

Aller hors de ce mdm20 a dire ... Pourquoi créez-vous un UserControl (une collection de contrôles regroupés en 1) lorsque vous pouvez créer beaucoup plus facilement un CustomControl (un contrôle qui étend la fonctionnalité d'un contrôle existant, tel qu'un bouton)? En supposant qu'un bouton est le seul contrôle que vous souhaitez dans CustomButton, je recommande fortement un CustomControl sur ce que vous avez (un UserControl).

Exemple de UserControl vs CustomControl here

Hope this helps!

+1

Oui, je lisais votre commentaire et pensais à la création d'un contrôle personnalisé ayant un bouton comme contrôle de base. Il y avait beaucoup d'exemples montrant UserControl donc j'ai commencé avec cela, en utilisant Microsoft Expression Blend pour construire un bouton personnalisé. Après avoir vu que je ne pouvais pas contrôler l'événement de clic. Mais plus tard, je vais apprendre à créer un bouton personnalisé simple et élégant. –

+0

Heureux qui a aidé! Bonne chance avec votre bouton personnalisé :) – Pwninstein

0

Impossible cette ligne:

(((sender as Button).Parent as Grid).Parent as CustomButton).Click(sender, e); 

remplacé par

this.Click(sender, e); 

?

Autre que cela bien que la réponse dépende du comportement exact que vous voulez. Si vous voulez cliquer sur l'événement de votre contrôle utilisateur pour ne déclencher que lorsque vous cliquez sur le bouton intérieur, je pense que vous le manipulez correctement. D'un autre côté, si vous voulez que l'événement click se déclenche chaque fois que vous cliquez n'importe où dans les limites du contrôle de l'utilisateur, vous avez probablement le meilleur style ou l'héritage du contrôle de bouton standard. Rappelez-vous que dans WPF le contenu du bouton peut être n'importe quel autre élément incluant un autre bouton.

+0

Non, cela ne fonctionnera pas. Je vois votre point, mais j'ai un bouton à l'intérieur d'un contrôle utilisateur, ce usercontrol est un "custombutton" qui a son propre événement de clic personnalisé par moi. L'idée est, lorsque vous cliquez sur l'intérieur, l'événement outter est exécuté! –

1

Si vous implémentez un bouton, pourquoi ne pas dériver simplement du bouton?

Pour répondre à votre question cependant, tout ce dont vous avez besoin c'est.

if (Click != null) Click(this, EventArgs.Empty); 
+0

ok, mais je me demandais où joindre cette déclaration ?? –

Questions connexes