如何将Popup中的鼠标事件传递给另一个控件?

时间:2013-10-28 19:28:34

标签: c# wpf xaml events popup

我有一个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属性”。我试图'伪造'一个路由事件,但无法解决如何。

任何帮助表示赞赏。哦,我是新来的,所以如果我打破礼仪,请告诉我。

0 个答案:

没有答案