0

我有这个 markupExtension 类

[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”)。但不能使用它的硬代码。

还有其他方法可以识别吗?

谢谢。

4

1 回答 1

0

我希望我的标记类中的方法比后面代码中的方法先执行。

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

但是,有一种方法可以让标记扩展在代码隐藏之前检测到点击:您可以让它处理PreviewClick事件(这是 的隧道版本Click

于 2011-06-15T21:36:00.400 回答