そのように宣言されたルーティング イベントがあります (無実を保護するために名前が変更されています)。
public class DragHelper : DependencyObject {
public static readonly RoutedEvent DragCompleteEvent = EventManager.RegisterRoutedEvent(
"DragComplete",
RoutingStrategy.Bubble,
typeof(DragRoutedEventHandler),
typeof(DragHelper)
);
public static void AddDragCompleteHandler( DependencyObject dependencyObject, DragRoutedEventHandler handler ) {
UIElement element = dependencyObject as UIElement;
if (element != null) {
element.AddHandler(DragCompleteEvent, handler);
}
}
public static void RemoveDragCompleteHandler( DependencyObject dependencyObject, DragRoutedEventHandler handler ) {
UIElement element = dependencyObject as UIElement;
if (element != null) {
element.RemoveHandler(DragCompleteEvent, handler);
}
}
かなり標準的なもの。XAML には、1 つのカスタム コントロールを含む DataTemplate があります。このイベント (およびその他の添付プロパティ) をコントロールに添付しようとしています:
<DataTemplate ...>
<My:CustomControl
My:DragHelper.IsDragSource="True"
My:DragHelper.DragComplete="DragCompleteHandler" />
</DataTemplate>
これでは、望ましい結果が得られません。具体的には、DragComplete イベントの RaiseEvent() を呼び出すコードが呼び出されている間、ハンドラーは呼び出されません。実際には、この XAML ファイルの他の場所にフックされている他のカスタム ルーティング イベントのハンドラーでもありません。
ルーティング イベントの名前を変更し、データ テンプレートを DataType から x:Key に切り替えてみました。これにより、動作に目に見える変化は生じませんでした。
ただし、My:CustomControl を TextBlock などの組み込みの WPF コントロールに変更すると、イベントは期待どおりに発生します。同様に、カスタム コントロールをプロジェクトの他のカスタム UserControl サブクラスに置き換えると、動作は壊れた、イベントがまったく処理されないように見える状態に戻ります。
これは私にはあまり意味がありません。このシナリオを機能させるために必要な特定のことはありますか? それは問題ではないようです。すべてのカスタム コントロールで実行した特定のことが原因でイベント処理が中断された可能性があると思いますが、これまでに試した 3 つまたは 4 つのカスタム コントロールでは共通点は見られませんでした。