0

私はこのマークアップ拡張クラスを持っています

[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を取得する他の方法はありますか?

ありがとう。

4

1 に答える 1

0

コード ビハインドのメソッドよりも、マークアップ クラスのメソッドを最初に実行したいと考えています。

イベントハンドラーが呼び出される順序は、イベントを発生させるクラス (その場合はボタン) によってのみ制御できます。それは新聞のようなものです: 定期購読をすると、「隣人より先に新聞を受け取りたい」と言うことができなくなります...

ただし、コード ビハインドの前にマークアップ拡張機能にクリックを検出させる方法があります。PreviewClickイベントを処理させることができます (これは のトンネリングバージョンですClick) 。

于 2011-06-15T21:36:00.400 に答える