我一直在敲打这个问题一段时间了!这是我的简单用户控件:
<UserControl x:Class="DaCapo.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:s="http://schemas.microsoft.com/surface/2008"
IsManipulationEnabled="True"
Width="300" Height="300">
<Canvas>
<s:SurfaceButton x:Name="button" Width="100" Height="100" Content="Click!" Style="{x:Null}"/>
<Popup x:Name="popup" Width="200" Height="100" IsOpen="False" StaysOpen="True" PlacementRectangle="0,0,200,100"
AllowsTransparency="True" Focusable="True">
<DockPanel x:Name="dockpanel" Width="200" Height="100" Background="SteelBlue" Focusable="True"/>
</Popup>
</Canvas>
</UserControl>
我希望能够检测DockPanel或其中可能的子项上的触摸。下面是同一个类的代码,以及我尝试的替代方案:
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
TouchExtensions.AddHoldGestureHandler(this.button, this.HoldHandler);
/* NONE OF THE FOLLOWING WORKS */
// TouchExtensions.AddTapGestureHandler(this.popup, this.TapHandler);
// this.dockpanel.TouchDown += new System.EventHandler<TouchEventArgs>(popup_TouchDown);
// this.popup.TouchDown += new System.EventHandler<TouchEventArgs>(popup_TouchDown);
// this.popup.ManipulationStarting += new System.EventHandler<ManipulationStartingEventArgs>(popup_ManipulationStarting);
// this.dockpanel.ManipulationStarting += new System.EventHandler<ManipulationStartingEventArgs>(popup_ManipulationStarting);
}
void popup_ManipulationStarting(object sender, ManipulationStartingEventArgs e) { Debug.WriteLine("Tap..."); }
void popup_TouchDown(object sender, TouchEventArgs e) { Debug.WriteLine("Tap..."); }
private void TapHandler(object sender, TouchEventArgs e) { Debug.WriteLine("Tap..."); }
private void HoldHandler(object sender, TouchEventArgs e) { Debug.WriteLine("Holding..."); this.popup.IsOpen = true; }
}
我相信我错过了一些明显的东西。有人可以帮帮我吗?感谢。
答案 0 :(得分:0)
按钮&amp;弹出窗口需要连接到XAML本身后面代码中定义的单击(或触摸)处理程序。
如果您想处理dockpanel的触摸事件,那该怎么办?
使用opacity = 0
??
编辑: 我可以看到您定义了一些处理程序,但是您是否将这些处理程序添加到按钮中?
例如,对于SurfaceButton:
在XAML:
<s:SurfaceButton Click="OpenButton_Click"/>
相应地将C#中的函数连接为:
private void OpenButton_Click(object sender, RoutedEventArgs e)
{
// Handle the action for the click here.
}
答案 1 :(得分:0)
与我在SurfaceScrollViewer: getting touch on nested children中描述的相似,似乎传统的Popup在这种情况下不是正确的解决方案。因此,我创建了一个基本上模仿弹出行为的用户控件,但仍然可以检测到触摸(因为它依赖于Canvas,我想)。
答案 2 :(得分:0)
在封面下,Popup创建另一个hwnd来呈现其内容。这与所有其他WPF控件不同。您需要使用Surface SDK注册此hwnd,以便它开始向其发送触摸事件。使用它来执行此操作:http://msdn.microsoft.com/en-us/library/microsoft.surface.presentation.input.touchextensions.enablesurfaceinput.aspx