2009-05-20 15 views
3

Haben Sie jemals ein Problem beim Zuweisen eines Click-Ereignishandlers für Ihr benutzerdefiniertes WPF-Benutzersteuerelement mit einem verschachtelten Schaltflächensteuerelement gefunden? Ich mache.Erstellen Sie einen benutzerdefinierten Click-Ereignishandler für ein WPF-Benutzersteuerelement, das eine Schaltfläche enthält?

Wenn Sie solche Benutzersteuerelemente in einem Hauptfenster verwenden, sagen wir Main.xaml, funktioniert MouseLeftButtonDown nicht, aber PreviewMouseLeftButtonDown funktioniert wie ein Charm.

Aber stell dir vor, du sagst jedem Entwickler in deinem Team, dieses Ereignis zu verwenden, wenn du deine Benutzersteuerung verwendest ... Einige Benutzersteuerungen in deiner Bibliothek haben MouseLeftButtonDown, andere PreviewMouseLeftButtonDown .... Es ist ein Chaos, meinst du nicht?

Ich habe also eine Lösung, aber ich möchte, dass jemand sieht, ob es eine elegante Möglichkeit gibt, Ihren eigenen Event-Handler namens "Click" zu erstellen.

In meinem Usercontrol genannt CustomButton.xaml.cs, habe ich bisher:

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; 

    } 

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

Jetzt in meinem Main.xaml, die Anrufer, ich habe:

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

Erläuterung:

Wenn Sie in der Benutzersteuerung auf die verschachtelte Schaltfläche klicken, wird der übergeordnete benutzerdefinierte "Click" -Handler ausgeführt.

Gibt es eine elegante Möglichkeit, den gleichen Effekt zu erzielen?

Antwort

3

abgehend von dem, was mdm20 sagen war ... Warum erstellen Sie ein Benutzersteuerelement (eine Sammlung von Kontrollen in 1 zusammengefasst), wenn Sie viel könnte leichter eine Custom schaffen (ein Steuerelement, das die Funktionalität eines erstreckt vorhandenes Steuerelement, z. B. ein Button)? Angenommen, eine Schaltfläche ist das einzige Steuerelement, das Sie in CustomButton möchten, würde ich ein CustomControl sehr empfehlen, was Sie haben (ein UserControl).

Beispiel von Usercontrol vs Custom here

hoffe, das hilft!

+1

Ja, ich habe Ihren Kommentar gelesen und darüber nachgedacht, ein benutzerdefiniertes Steuerelement mit einem Button als Basissteuerung zu erstellen. Es gab viele Beispiele, die UserControl zeigten, also begann ich damit, mit Microsoft Expression Blend eine benutzerdefinierte Schaltfläche zu erstellen. Nachdem ich gesehen habe, konnte ich das Klickereignis nicht kontrollieren. Aber später werde ich lernen, wie man eine einfache und elegante benutzerdefinierte Schaltfläche erstellt. –

+0

Froh, dass geholfen hat! Viel Glück mit Ihrem benutzerdefinierten Button :) – Pwninstein

0

Könnte diese Zeile nicht:

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

durch

ersetzt werden
this.Click(sender, e); 

?

Abgesehen davon hängt die Antwort jedoch von dem genauen Verhalten ab, das Sie wollen. Wenn Sie auf das Ereignis Ihres Benutzersteuerelements klicken möchten, um nur auszulösen, wenn Sie auf den inneren Knopf klicken, dann denke ich, dass Sie es richtig handhaben. Wenn Sie andererseits möchten, dass das Klickereignis ausgelöst wird, wenn Sie innerhalb der Grenzen des Benutzersteuerelements auf eine beliebige Stelle klicken, sind Sie wahrscheinlich am besten in der Lage, das standardmäßige Schaltflächensteuerelement zu formatieren oder zu erben. Denken Sie daran, dass in WPF der Inhalt der Schaltfläche ein beliebiges anderes Element einschließlich einer anderen Schaltfläche sein kann.

+0

Nein, es wird nicht funktionieren. Ich sehe Ihren Punkt, aber ich habe eine Schaltfläche in einem Benutzersteuerelement, diese Benutzersteuerung ist eine "custombutton", die ein eigenes Klick-Ereignis von mir angepasst hat. Die Idee ist, wenn Sie auf das innere klicken, wird das utter-Ereignis ausgeführt! –

1

Wenn Sie eine Schaltfläche implementieren, warum nicht einfach von der Schaltfläche ableiten?

Um Ihre Frage zu beantworten, alles, was Sie brauchen, ist dies.

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

ok, aber ich frage mich, wo diese Aussage zu befestigen? –

Verwandte Themen