1

我正在尝试在 WPF 中创建一个可以接收触摸事件的浮动控件。我搜索了很多,发现浮动控件的唯一解决方案是 Popup 控件。问题:Popup 控件无法接收触摸事件。而且由于我SurfaceListBox在弹出窗口中使用了一个,我需要触摸事件。我试图通过以下方式使弹出窗口接收触摸事件:

TouchExtensions.EnableSurfaceInput((HwndSource)HwndSource.FromVisual(this.selectionListPopup));

但它没有任何效果。有没有办法让弹出窗口接收触摸?有没有其他可以使用的控件或方式?

我的最终目标是让一个控件浮动在其他控件之上——这意味着它不会被其他控件剪裁或遮挡。

这是我到目前为止使用的 XAML:

<Popup Name="selectionListPopup"
        PlacementTarget="{Binding ElementName=selectedItemButton}"
        Placement="Relative"
        VerticalOffset="{Binding ElementName=this, Path=SelectionListTop}"
        HorizontalOffset="{Binding ElementName=this, Path=SelectionListLeft}"
        IsOpen="{Binding ElementName=this, Path=IsSelecting, Mode=TwoWay}"
        StaysOpen="False"
        AllowsTransparency="True" 
        Focusable="False">
        <s:SurfaceListBox Name="selectionList"
                          ItemsSource="{Binding ElementName=this, Path=ItemsSource}"
                          SelectedItem="{Binding ElementName=this, Path=SelectedItem, Mode=TwoWay}"
                          SelectionChanged="OnSelectionListSelectionChanged">
        </s:SurfaceListBox>
</Popup>
4

1 回答 1

2

它不是 Popup 的 HwndSource,而是 Popup.Child 的可视父级的 HwndSource。听起来很奇怪,我知道。

因此,在弹出窗口的 Opened 事件中,我调用以下代码:

var myPopup = sender as Popup;

HwndSource hwndSource = (HwndSource)PresentationSource.FromVisual((Visual)VisualTreeHelper.GetParent(myPopup.Child)); 

hwndSource.EnableSurfaceInput();
于 2012-08-24T21:05:59.423 回答