2011-06-15 45 views
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?

谢谢。

回答

0

我想我的标记类中的方法首先执行,而不是后面的代码中的方法。

这是不可能的,调用事件处理程序的顺序只能由引发事件的类(在这种情况下为按钮)控制。这就像一份报纸:当你订阅它时,你不能说“我想在我的邻居之前收到我的文件”...

但是有一种方法可以让代码在标记之前检测到点击 - 你可以让它处理PreviewClick事件(这是tunnelling版本Click

+0

我知道你在说什么,但是如果你删除了所有的处理程序,并再次添加,那么你在标记类中添加的事件将会成为第一个。我现在是一种方法来做到这一点。我把这个例子发送给我的问题。但是我的solotion有一个问题,我不知道如何发现事件名称来移除处理程序。 你是如何发现它的? – Pescarolo 2011-06-15 23:50:19

+0

这也是不可能的,处理程序可以被命名为任何东西......“Control_Event”命名模式只是一个约定,没有什么强制它。 – 2011-06-16 00:50:36

+0

好的,我尝试使用Xamlwriter.Save来获取元素的XAML,但他们可能会激怒处理程序。你有另一个想法吗? – Pescarolo 2011-06-16 01:13:09

相关问题