1

これが私の要素ツリーの構成方法です(無関係な情報は削除されています)。

<TabItem Style="Click_PutNormalCursorBack">
   <ScrollViewer>
      <ItemsControl Style="ContainsMuchLabels_n_CollapsibleGroupeHeaders">
         <Label Style="Click_ChangeCursor" />
      </ItemsControl>
   <ScrollViewer>
</TabItem>

ドラッグアンドドロップをシミュレートしています。クリック可能なラベルをクリックすると、カーソルが変形して、ドラッグしたような印象を受けます。私が欲しいのは、TabItemをクリックすると、通常のカーソルが元に戻ることです。

PreviewMouseDown イベントを使用すると、ラベルのクリックが許可されないため、使用できません。

私が見つけた解決策の 1 つは、ScrollViewer と ItemsControl の間の要素ツリーに大きなパネルを追加して、クリックを受け取る透明な背景を追加し、ItemsControl の CollapsibleGroupHeaderItemsPanel にイベント ハンドラーを配置することでしたが、実際にはエレガントな解決策ではありません。

そのような問題を解決するために、WPF で RoutedEvents を扱います...

注:私のハンドラーは私のスタイルではなく、より多くの情報を提供するためだけのスタイルです

私よりも良い解決策はありますか?

4

1 に答える 1

1

どちらにも MouseDown イベントを使用します。イベントが適用されない場合は、イベントを処理済み (e.Handled = true) とマークしないでください。たとえば、クリック可能なタブで、カーソルがドラッグ状態でないときにクリックされた場合は、処理済みとしてマークしないでください。カーソルがドラッグ状態になった後、ユーザーがクリック可能なラベルを再度クリックした場合は、処理済みとしてマークしないでください (そのイベントでカーソルをリセットする場合を除きます)。タブで PreviewMouseDown イベントを使用することもできますが、そのクリックがラベルから発生したカーソルによるものでない限り、処理済みとしてマークしないでください。

イベントを処理済みとしてマークしない場合、イベントは伝播し続けるため、複数のコントロールで処理できます。イベントが処理済みとしてマークされていて、それを処理したい場合でも、処理済みとしてマークされている場合でもイベントを発生させることができます。この記事の「イベントが処理済みとしてマークされている場合でも発生するインスタンス ハンドラーを追加する」を参照してください。

于 2011-07-13T20:57:49.017 に答える