Aquí hay una versión muy sencilla, ya que no estoy usando las propiedades de dependencia o nada. Expondrá la propiedad Click. Esto supone que el nombre de la parte de la plantilla del botón es "Botón".
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);
}
}
}
}
¿Su control personalizado es un control de usuario (se deriva de UserControl), o un control verdadero? Debería poder exponer un evento público en el código detrás del archivo y adjuntarlo a los eventos de los controles de su hijo para mostrar el evento. –
Son 2 controles verdaderos combinados en 1, y solo quiero exponer el evento click del botón. Puedo acceder al evento click cuando estoy trabajando en el control del usuario, pero si estoy trabajando en algo que consuma el control del usuario, no llegaré a ese controlador de eventos. – PlayKid