2009-08-17 14 views
5

Wie erstelle ich ein Ereignis, das ein Klick-Ereignis eines meiner anderen Steuerelemente aus meinem benutzerdefinierten Steuerelement behandelt? HierSilverlight Custom Control Benutzerdefinierte Ereignisse erstellen

ist das Setup von dem, was ich habe: eine Textbox und eine Schaltfläche (Custom Control) eine Silverlight-Anwendung (verwendet, dass über benutzerdefinierte Steuerung)

Ich mag würde das Click-Ereignis der belichten Schaltfläche aus dem benutzerdefinierten Steuerelement in der Hauptanwendung, wie mache ich das?

Dank

+0

Ist Ihr benutzerdefiniertes Steuerelement ein Benutzersteuerelement (abgeleitet von UserControl) oder ein echtes Steuerelement? Sie sollten in der Lage sein, ein öffentliches Ereignis im Code hinter der Datei verfügbar zu machen, und an die Ereignisse Ihrer untergeordneten Steuerelemente anhängen, um das Ereignis zu überdecken. –

+0

Sie sind 2 echte Steuerelemente in 1 kombiniert, und ich möchte nur das Click-Ereignis der Schaltfläche offen legen. Ich kann zu dem Klickereignis gelangen, wenn ich an dem Benutzersteuerelement arbeite, aber wenn ich an etwas arbeite, das das Benutzersteuerelement verbraucht, werde ich nicht zu diesem Ereignishandler gelangen. – PlayKid

Antwort

8

Hier ist eine super einfache Version, da ich nicht Abhängigkeitseigenschaften oder irgendetwas bin mit. Es wird die Click-Eigenschaft verfügbar machen. Dies setzt voraus, dass der Name des Schaltflächenvorlagenabschnitts "Schaltfläche" lautet.

using System.Windows; 
using System.Windows.Controls; 

namespace SilverlightClassLibrary1 
{ 
    [TemplatePart(Name = ButtonName , Type = typeof(Button))] 
    public class TemplatedControl1 : Control 
    { 
     private const string ButtonName = "Button"; 

     public TemplatedControl1() 
     { 
      DefaultStyleKey = typeof(TemplatedControl1); 
     } 

     private Button _button; 

     public event RoutedEventHandler Click; 

     public override void OnApplyTemplate() 
     { 
      base.OnApplyTemplate(); 

      // Detach during re-templating 
      if (_button != null) 
      { 
       _button.Click -= OnButtonTemplatePartClick; 
      } 

      _button = GetTemplateChild(ButtonName) as Button; 

      // Attach to the Click event 
      if (_button != null) 
      { 
       _button.Click += OnButtonTemplatePartClick; 
      } 
     } 

     private void OnButtonTemplatePartClick(object sender, RoutedEventArgs e) 
     { 
      RoutedEventHandler handler = Click; 
      if (handler != null) 
      { 
       // Consider: do you want to actually bubble up the original 
       // Button template part as the "sender", or do you want to send 
       // a reference to yourself (probably more appropriate for a 
       // control) 
       handler(this, e); 
      } 
     } 
    } 
}