我有一个DataBox,由ListBox用来为每个ListBoxItem提供'look'。另外,因为这些ListBoxItems可以比它们所在的列更宽,所以如果鼠标位于此项目之上,我还会在ListBoxItem的顶部绘制一个Popup。 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>
请注意与弹出窗口中的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但这没有帮助 - 我猜是因为Popup是一个单独的Window而不是Visual Tree的一部分,因此没有任何地方可以将事件冒泡到? / p>
我也尝试过更改mouseEvent.Source,但是我收到运行时错误“在路由事件时无法更改RoutedEvent属性”。我试图'伪造'一个路由事件,但无法解决如何。
任何帮助表示赞赏。哦,我是新来的,所以如果我打破礼仪,请告诉我。