Почему мое всплывающее окно не реагирует на прикосновения? - PullRequest
0 голосов
/ 16 ноября 2011

Я уже давно бьюсь об этом!Вот мой простой пользовательский элемент управления:

<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; }
}

Я верю, что упускаю что-то очевидное.Может кто-нибудь, пожалуйста, помогите мне?Спасибо.

Ответы [ 3 ]

0 голосов
/ 17 ноября 2011

Подобно тому, что я описываю в SurfaceScrollViewer: касаясь вложенных детей , кажется, что традиционное всплывающее окно не является правильным решением в этом контексте.Поэтому я создал пользовательский элемент управления, который в основном имитирует поведение всплывающих окон, но все еще может обнаруживать прикосновения (я полагаю, он полагается на Canvas).

0 голосов
/ 17 ноября 2011

Под обложками Popup создает другой hwnd для рендеринга своего контента. Это отличается от всех других элементов управления WPF. Вам необходимо зарегистрировать этот hwnd в Surface SDK, чтобы он начал отправлять сенсорные события на него. Используйте это, чтобы сделать это: http://msdn.microsoft.com/en-us/library/microsoft.surface.presentation.input.touchextensions.enablesurfaceinput.aspx

0 голосов
/ 16 ноября 2011
  • Кнопка и всплывающее окно должны быть подключены к обработчикам щелчка (или касания), определенных в приведенном ниже коде, в самом XAML.

  • Если вы хотитедля обработки событий касания для панели док-станции, как насчет добавления кнопки в панель док-станции с помощью opacity = 0 ??


РЕДАКТИРОВАТЬ: Я вижу, что выопределили несколько обработчиков, но вы добавили эти обработчики к кнопке?

Например, для SurfaceButton:

IN XAML:

<s:SurfaceButton Click="OpenButton_Click"/>

Соответственно подключает функциюв C # как:

private void OpenButton_Click(object sender, RoutedEventArgs e)
{
    // Handle the action for the click here.
}
...