各 ListBoxItem の「外観」を提供するために ListBox で使用される DataTemplate があります。さらに、これらの ListBoxItems はそれらが保持されている列よりも広くなる可能性があるため、マウスがこの項目の上にある場合、ListBoxItem の上に描画される Popup もあります。ポップアップは、それがカバーする項目と同じ ContentTemplate を使用するため、外観は、マウスの下の項目が、それが存在する ListBox の境界へのクリッピングを停止するだけです。マウス イベントをコントロールに正常に戻すことができないことを除いて、うまく機能します。基になるコントロールがドラッグ操作の開始を検出できるように、隠されています。
<!--This datatemplate is used to create a popup over the listboxitem in ItemsView.xaml-->
<DataTemplate x:Key="PopupDaybookItemDataTemplate">
<StackPanel x:Name="pdidt">
<Popup x:Name="myPopup" PlacementTarget="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}}" Placement="Relative" StaysOpen="True">
<Popup.Style>
<Style TargetType="{x:Type Popup}">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=myPopup, Path=IsMouseOver}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="IsOpen" Value="True" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Mode=OneWay, ElementName=pdidt, Path=IsMouseOver}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="IsOpen" Value="True" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Popup.Style>
<ListBoxItem Style="{StaticResource DayBookItemStyle}"
PreviewMouseDown="ItemListPopup_OnMouseButtonEvent"
MouseDown="ItemListPopup_OnMouseButtonEvent"
PreviewMouseMove="ItemListPopup_OnMouseEvent"
MouseMove="ItemListPopup_OnMouseEvent"
>
<ContentPresenter ContentTemplate="{StaticResource DaybookItemDataTemplate}"
PreviewMouseDown="ItemListPopup_OnMouseButtonEvent"
MouseDown="ItemListPopup_OnMouseButtonEvent"
PreviewMouseMove="ItemListPopup_OnMouseEvent"
MouseMove="ItemListPopup_OnMouseEvent"
/>
</ListBoxItem>
</Popup>
<ContentPresenter x:Name="MyItemPresenter" ContentTemplate="{StaticResource DaybookItemDataTemplate}" ></ContentPresenter>
</StackPanel>
</DataTemplate>
Popup 内の ListBoxItem と ContentPresenter の両方に関連付けられたイベントに注意してください。これらは、次のコード ビハインドに関連付けられています。
private void ItemListPopup_OnMouseButtonEvent(object sender, MouseButtonEventArgs e)
{
Popup popup = (((DependencyObject)sender).GetVisualParent<Popup>());
popup.PlacementTarget.RaiseEvent(e);
}
private void ItemListPopup_OnMouseEvent(object sender, MouseEventArgs e)
{
Popup popup = (((DependencyObject)sender).GetVisualParent<Popup>());
popup.PlacementTarget.RaiseEvent(e);
}
PlacementTarget は、描画される ListBoxItem です。ContentPresenter の MouseDown は、基になる ListViewItem がクリックされて選択されたことを認識できるようにするものであり、それは正常に機能しています。私の期待に反して、ListBoxItem の MouseDown はそうではありません。(ContentPresenter MouseDown イベントがフックされているかどうか)。他のイベントは有用なタスクを実行していないように見えますが、試すのは当然だと思うので含めます。
MouseDown イベントと MouseMove イベントを基礎となる ListBox にリレーすると、ドラッグ操作を検出できると期待していましたが、そうではありません。この方法 (トンネリングとバブリング) ですべてのマウス イベントを渡すことも試みましたが、ドラッグ操作はまだ開始されません。ポップアップが (永続的に) 無効になっている場合、基になるコントロールはドラッグ操作を完全に検出しますが、マウス イベント内でポップアップを無効にしても役に立ちません。
Popup IsHitTestVisible を false に設定しようとしましたが、それは役に立ちません。ポップアップは別のウィンドウであり、ビジュアル ツリーの一部ではないため、イベントがバブルアップする場所がどこにもないためだと思います。
mouseEvent.Source も変更しようとしましたが、「イベントがルーティングされている間は RoutedEvent プロパティを変更できません」というランタイム エラーが発生します。ルーティング イベントを「偽装」しようとしましたが、方法がわかりませんでした。
どんな助けでも感謝します。ああ、私はここに来たばかりなので、エチケットを破ったら教えてください。