2011-07-13 8 views
1

私の要素ツリーはどのように構成されていますか(無関係な情報は削除されました)。Routed Events&ScrollViewer

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

私はドラッグアンドドロップをシミュレートしています。クリック可能なラベルをクリックすると、ドラッグした印象をあなたのカーソルに伝えます。私が望むのは、TabItemをクリックすると、通常のカーソルが戻されるということです。

ラベルをクリックすることができないため、PreviewMouseDownイベントを使用できません。私が見つけた

一つの解決策は、私のItemsControlのCollapsibleGroupHeader ItemsPanelが、そのない、本当にエレガントなソリューションにイベントハンドラを入れて、私のScrollViewerのとクリックを受け取るために、透明な背景を持つ私のItemsControlの間に私の要素ツリーに大きなパネルを追加しました。

THERが問題のようなものを解決するために、WPFでI厳しいRoutedEvents ...

注:私のハンドラは私の私のスタイルではない、より多くの情報

をguivingためだけTHERがTHERですスタイル私よりも良い解決策ですか?

答えて

1

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

イベントの処理をマークしないと、イベントは複数のコントロールで処理できるように伝播を続けます。イベントが処理されたことをマークしてもそれを処理したい場合でも、処理済みの場合でもイベントを発生させることができます:this article

+0

ベリーの良いアイデアe.OriginalSourceを使用します。 – Gab