0
我有这样的MarkupExtension类C#如何首先执行标记事件?
[MarkupExtensionReturnType(typeof(FrameworkElement))]
[ContentProperty("content")]
public class InsereSom : MarkupExtension
{
public InsereSom()
{ }
[ConstructorArgument("Ligado")]
public bool Ligado
{
get;
set;
}
[ConstructorArgument("Evento")]
public RoutedEvent Evento
{
get;
set;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
IProvideValueTarget target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
FrameworkElement elemento = target.TargetObject as FrameworkElement;
RoutedEventHandler metodo = new RoutedEventHandler(EventoInsereSom);
elemento.AddHandler(Evento, metodo);
EventInfo eventInfo = elemento.GetType().GetEvent("Click");
FrameworkElement parentClass = (MainWindow)((Grid)elemento.Parent).Parent;
Delegate methodDelegate = Delegate.CreateDelegate(eventInfo.EventHandlerType, parentClass, "Button_Click");
eventInfo.RemoveEventHandler(elemento, methodDelegate);
eventInfo.AddEventHandler(elemento, methodDelegate);
return new System.Windows.Controls.Label();
}
public void EventoInsereSom(object sender, RoutedEventArgs e)
{
MessageBox.Show("Hello Extension Markup");
}
而且此XAML
<Button Width="80" Height="25" Click="Button_Click" Name="BtnTeste">
<Cei:InsereSom Ligado="True" Evento="Button.Click"/>
</Button>
背后
public void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Event code behind");
}
这个代码,我想,我在我的标记类的方法执行比第一方法在后面的代码中。
我尝试添加和删除EventHandler,但为此我需要事件名称(“Button_Click”)。但不能使用它的硬代码。
有没有其他的方式来ID?
谢谢。
我知道你在说什么,但是如果你删除了所有的处理程序,并再次添加,那么你在标记类中添加的事件将会成为第一个。我现在是一种方法来做到这一点。我把这个例子发送给我的问题。但是我的solotion有一个问题,我不知道如何发现事件名称来移除处理程序。 你是如何发现它的? – Pescarolo 2011-06-15 23:50:19
这也是不可能的,处理程序可以被命名为任何东西......“Control_Event”命名模式只是一个约定,没有什么强制它。 – 2011-06-16 00:50:36
好的,我尝试使用Xamlwriter.Save来获取元素的XAML,但他们可能会激怒处理程序。你有另一个想法吗? – Pescarolo 2011-06-16 01:13:09