Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将鼠标事件从弹出窗口传递到另一个控件?_C#_Wpf_Xaml_Events_Popup - Fatal编程技术网

C# 如何将鼠标事件从弹出窗口传递到另一个控件?

C# 如何将鼠标事件从弹出窗口传递到另一个控件?,c#,wpf,xaml,events,popup,C#,Wpf,Xaml,Events,Popup,我有一个数据模板,ListBox使用它为每个ListBoxItem提供“外观”。此外,由于这些ListBoxItems可以比它们所在的列宽,因此如果鼠标在该项上,我还可以在ListBoxItem的顶部绘制一个弹出窗口。 弹出窗口使用与它覆盖的项目相同的ContentTemplate,因此外观是鼠标下的项目只是停止剪切到它所在的列表框的边界。它工作得很好,只是我无法成功地将鼠标事件传递回它正在遮挡的控件,以便底层控件可以检测到开始的拖动操作 <!--This datatemplate is

我有一个数据模板,ListBox使用它为每个ListBoxItem提供“外观”。此外,由于这些ListBoxItems可以比它们所在的列宽,因此如果鼠标在该项上,我还可以在ListBoxItem的顶部绘制一个弹出窗口。 弹出窗口使用与它覆盖的项目相同的ContentTemplate,因此外观是鼠标下的项目只是停止剪切到它所在的列表框的边界。它工作得很好,只是我无法成功地将鼠标事件传递回它正在遮挡的控件,以便底层控件可以检测到开始的拖动操作

<!--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);
    }
private void ItemListPopup_onmousebuttonenevent(对象发送器,MouseButtonEventArgs e)
{
Popup Popup=((DependencyObject)发送方.GetVisualParent());
popup.PlacementTarget.RaiseEvent(e);
}
私有void ItemListPopup_OnMouseEvent(对象发送者,MouseEventArgs e)
{
Popup Popup=((DependencyObject)发送方.GetVisualParent());
popup.PlacementTarget.RaiseEvent(e);
}
PlacementTarget是正在绘制的ListBoxItem。 ContentPresenter上的MouseDown允许底层ListViewItem知道它已被单击并因此被选中,这很正常。与我的预期相反,ListBoxItem上的鼠标向下移动没有。(无论ContentPresenter MouseDown事件是否挂接)。 其他事件似乎没有执行任何有用的任务,但我将它们包括在内,因为我认为它们显然是一件值得尝试的事情

我希望将MouseDown和MouseMove事件中继到底层的ListBox将允许它检测到拖动操作,但它没有。我也尝试过以这种方式传递所有鼠标事件(隧道和冒泡),但拖动操作仍然不会启动。 如果弹出窗口被(永久)禁用,则基础控件可以完美地检测拖动操作,但是在鼠标事件中禁用弹出窗口没有帮助

我曾尝试将弹出窗口IshittesVisible设置为false,但这没有帮助-我猜是因为弹出窗口是一个单独的窗口,而不是视觉树的一部分,因此没有任何地方可以让事件冒泡

我也尝试过更改mouseEvent.Source,但遇到运行时错误“无法在路由事件时更改RoutedEvent属性”。我试图“伪造”一个路由事件,但不知道如何进行


谢谢你的帮助。哦,我是新来的,如果我违反了礼仪,请告诉我。

您可能会更幸运,只需使用带有动态列宽的
网格
控件,就可以“使内容适合”每个
ListBoxItem
中的任何可用空间。谢谢,但我没有正确解释。想象一下,一个狭窄的列表框中填充了具有较宽文本内容的ListBoxItems,因此每个文本位的开头都是可见的。列表框位于可停靠窗格中,因此它可以位于任何位置!当(且仅当)鼠标位于给定的ListBox项上时,弹出窗口用于在ListBox中的项上重新绘制该项。由于弹出窗口模仿了该项,但没有剪切到列表框的边界,因此当鼠标悬停时,该项会显示为全宽,即使这意味着要覆盖其他UI或完全脱离窗口的右边缘。难道不能在事件中将其从代码中传递到其他方法吗?也许,但这意味着要学习如何在我使用的库中启动拖动。我宁愿研究如何使弹出窗口对鼠标活动真正透明,以便其下面的控件可以与鼠标交互。