1

私は現在、C# WPF カスタム ルーティング イベントを試しているところ、問題が発生しました。これが私がやりたいことです: メイン ウィンドウからカスタム ルーティング イベントを発生させ、スタックパネルを通過して Button クラスから派生したカスタム コントロールに到達させたいと考えています。その後、カスタム コントロールがルーティング イベントを処理します。

私の問題は、イベントを発生させたときにハンドラーが呼び出されないことです。

私のコード:

    public partial class MainWindow : Window
        {

        public static readonly RoutedEvent MyRoutedEvent = EventManager.RegisterRoutedEvent("MyRoutedEvent", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(UIElement));

        public static void AddMyRoutedEventHandler(DependencyObject d, RoutedEventHandler handler)
        {
            UIElement uie = d as UIElement;
            if (uie != null)
            {
                uie.AddHandler(MainWindow.MyRoutedEvent, handler);
            }
        }

        public static void RemoveMyRoutedEventHandler(DependencyObject d, RoutedEventHandler handler)
        {
            UIElement uie = d as UIElement;
            if (uie != null)
            {
                uie.RemoveHandler(MainWindow.MyRoutedEvent, handler);
            }
        }


        public MainWindow()
        {
            InitializeComponent();
        }

        private void keyClassButton1_MyRoutedEvent(object sender, RoutedEventArgs e)
        {
            Console.Write("\nMyRoutedEvent!");
        }

        private void Window_MouseDown(object sender, MouseButtonEventArgs e)
        {
            RoutedEventArgs newEventArgs = new RoutedEventArgs(MyRoutedEvent, this);
            RaiseEvent(newEventArgs);
        }
    }

XAML コード:

<Window x:Class="RoutedEvent_Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:RoutedEvent_Test"
        Title="MainWindow" Height="350" Width="525" MouseDown="Window_MouseDown">
    <Grid>
        <StackPanel Name="stackPanel1">
            <local:KeyClass x:Name="keyClass1" Content="key class button" Height="30" local:MainWindow.MyRoutedEvent="keyClassButton1_MyRoutedEvent"></local:KeyClass>
        </StackPanel>
    </Grid>
</Window>
4

2 に答える 2

3

わかりました私は自分でそれを理解しました:私はそれを千回のように読みましたが、MSDNの説明に明確に記載されています:

トンネリング: 最初に、要素ツリーのルートにあるイベント ハンドラーが呼び出されます。次に、ルーティング イベントは、ルーティング イベント ソース (ルーティング イベントを発生させた要素) であるノード要素に向かって、ルートに沿って連続する子要素を経由してルートをたどります。[...]

トンネル化されたルーティング イベントの最初のアイデアは、メイン ウィンドウからイベントを発生させ、それがスタックパネルを経由してボタン要素に到達するというものでした。 BUT INSTEAD: すでにボタンから起動する必要があります。その後、ルート要素 (メイン ウィンドウ) から開始し、コントロール レイヤーを経由して、最初にイベントを起動したボタン要素に移動します。

私がしたことは次のとおりです。メインウィンドウからイベントを発生させたので、他の場所には移動できませんでした

于 2012-07-05T18:57:23.907 に答える
0

この登録は正しくないようです:

public static readonly RoutedEvent MyRoutedEvent = EventManager.RegisterRoutedEvent("MyRoutedEvent", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(UIElement));

public event ReoutedEventHandler MyRoutedEventここで登録したクラスにを追加する必要があります。これは、非静的クラスインスタンスレベルのハンドラーである必要があります。あなたのコードには表示されません。

MainWindowには次のようなものが必要です。

public event RoutedEventHandler MyRoutedEvent;

こちらのMSDNの例を参照してください。

于 2012-07-04T23:26:14.670 に答える