2012-04-09 10 views
5

Ich bin neu in der Entwicklung von WPF für Touchscreens und habe Probleme beim Interpretieren von Manipulationsereignissen. Was ich tun möchte, ist ziemlich einfach, glaube ich: Wenn der Benutzer irgendwo auf einem UserControl drückt, wird eine Aktion ausgeführt.Manipulationsereignisse werden nicht ausgelöst

Also, in der Kontrolle Ich habe (dies ist Oberflächen 2.0/Windows Touch):

XAML

<Grid Background="White" IsManipulationEnabled="True" 
ManipulationStarting="Grid_ManipulationStarting" 
ManipulationDelta="Grid_ManipulationDelta"> 
    <!--Some content controls--> 
</Grid> 

C#

private void Grid_ManipulationStarting(object sender, ManipulationStartingEventArgs e) 
{ 
    e.ManipulationContainer = this; 
} 

private void Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) 
{ 
    //do the thing... you know, that thing you do 
} 

diese jedoch weder von Ereignisse Feuer, wenn ich meine Hände über den ganzen Bildschirm reibe. Ich denke, ich darf den Verlauf des Ereignisses in dieser Situation nicht verstehen. Mein Monitor (3M MicroTouch PX) hatte keine Probleme, Berührungsereignisse oder integrierte Manipulationen wie in ScatterViewItems zu verstehen.

EDIT: Ich entfernte Kontrollen aus dem Grid und sie feuern jetzt, also ich denke, Manipulationen werden durch den Inhalt abgefangen. Entschuldigung, hätte über den Inhalt des Controls klarer sein sollen, weil es sich um das Problem handelt.

Speziell ich denke, es hat mit der Tatsache zu tun, dass ich eine SurfaceListBox im Inneren habe. Ich könnte mir vorstellen, dass die SurfaceListBox Manipulationen abfängt. Gibt es eine Möglichkeit, dass ich sagen kann, dass ich aussteigen soll? Ich versuche immer noch meinen Kopf in die Richtung zu ziehen, in der WPF Ereignisse ausführt.

Edit2: Gehen Sie etwas mehr vollständigen Code einfügen.

SEMANTICPANEL.XAML VOLL

<UserControl x:Class="SemanticZoom.SemanticPanel" 
     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:local="clr-namespace:SemanticZoom" 
     xmlns:views="clr-namespace:SemanticZoom.Views" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<UserControl.Resources> 
</UserControl.Resources> 
<Grid Background="White" IsManipulationEnabled="True" ManipulationStarting="Grid_ManipulationStarting" ManipulationDelta="Grid_ManipulationDelta"> 
    <views:CategoryView x:Name="CategoryView"/> 
    <views:ShelfView x:Name="ShelfView" Visibility="Hidden" /> 
    <views:BookView x:Name="BookView" Visibility="Hidden" /> 
</Grid> 

SEMANTICPANEL.CS VOLL

public partial class SemanticPanel : UserControl 
{ 
    public SemanticPanel() 
    { 
     InitializeComponent(); 
     CategoryView.CategorySelected += new EventHandler(CategoryView_CategorySelected); 
     ShelfView.BookSelected += new EventHandler(ShelfView_BookSelected); 
     ShelfView.ZoomOut += new EventHandler(View_ZoomOut); 
    } 

    void View_ZoomOut(object sender, EventArgs e) 
    { 
     if (sender == ShelfView) 
     { 
      ShelfView.Visibility = System.Windows.Visibility.Hidden; 
      CategoryView.Visibility = System.Windows.Visibility.Visible; 
     } 
     else if (sender == BookView) 
     { 
      BookView.Visibility = System.Windows.Visibility.Hidden; 
      ShelfView.Visibility = System.Windows.Visibility.Visible; 
     } 
    } 

    void ShelfView_BookSelected(object sender, EventArgs e) 
    { 
     BookView.Books = ShelfView.BookList; 
     ShelfView.Visibility = System.Windows.Visibility.Hidden; 
     BookView.Visibility = System.Windows.Visibility.Visible; 
    } 

    void CategoryView_CategorySelected(object sender, EventArgs e) 
    { 
     ShelfView.Category = CategoryView.ActiveCategory; 
     ShelfView.Visibility = System.Windows.Visibility.Visible; 
     CategoryView.Visibility = System.Windows.Visibility.Hidden; 
     ShelfView.RefreshBooks(); 
    } 

    private void Grid_ManipulationStarting(object sender, ManipulationStartingEventArgs e) 
    { 
     //e.ManipulationContainer = this; 
    } 

    private void Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) 
    { 
     if (e.DeltaManipulation.Scale.X < 0) 
     { 
      if (ShelfView.Visibility == System.Windows.Visibility.Visible) 
      { 
       ShelfView.Visibility = System.Windows.Visibility.Hidden; 
       CategoryView.Visibility = System.Windows.Visibility.Visible; 
      } 
      else if (BookView.Visibility == System.Windows.Visibility.Visible) 
      { 
       BookView.Visibility = System.Windows.Visibility.Hidden; 
       ShelfView.Visibility = System.Windows.Visibility.Visible; 
      } 
     } 
    } 

CATEGORYVIEW.XAML

<UserControl x:Class="SemanticZoom.Views.CategoryView" 
     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" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<UserControl.Resources> 
    <!--CATEGORY TEMPLATE--> 
    <DataTemplate x:Name="CategoryTemplate" x:Key="CategoryTemplate"> 
     <s:SurfaceButton Background="Gray" Click="CategoryClicked" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="200" Width="300"> 
      <TextBlock Text="{Binding Name}" TextWrapping="Wrap" Foreground="White" FontSize="20" FontWeight="Bold" /> 
     </s:SurfaceButton> 
    </DataTemplate> 
    <!--CATEGORY STYLE--> 
    <Style TargetType="{x:Type s:SurfaceListBoxItem}"> 
     <Setter Property="Width" Value="300"/> 
     <Setter Property="Height" Value="200"/> 
    </Style> 
</UserControl.Resources> 
<Grid> 
    <s:SurfaceListBox x:Name="CategoryList" ItemTemplate="{StaticResource CategoryTemplate}"> 
     <s:SurfaceListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel IsItemsHost="True" 
          Height="{Binding ActualHeight, RelativeSource={RelativeSource AncestorType={x:Type ScrollContentPresenter}, Mode=FindAncestor}}"/> 
      </ItemsPanelTemplate> 
     </s:SurfaceListBox.ItemsPanel> 
    </s:SurfaceListBox> 
</Grid> 

Nur mich nicht beurteilen, weil a) Ja ich versuche Semantic Zoom und b) ja, ich mache einen Hacky Job davon zu emulieren. Ich brauche nur ein einfaches Arbeitskonzept. Jede der Ansichten ähnelt im Wesentlichen CategoryView.

+0

Warum ändern Sie e.ManipulationContainer? –

+0

Sind Sie sicher, dass Sie den Bildschirm im Bereich unseres Rasters berühren? Ist es groß genug? –

+0

@AndriyBuday: Ich weiß es nicht wirklich, es war Teil einer Probe, die ich angeschaut habe. Es macht keinen Unterschied, da es nie aufgerufen wird, aber ich werde es kommentieren, bis ich die Dinge ausgearbeitet habe. Das Raster ist jetzt Vollbild und die Hintergrundfarbe bestätigt dies. Also ich vermisse es zumindest nicht. –

Antwort

0

Vielen Dank für Ihre Hilfe Andriy, aber es scheint, das Problem war so einfach wie mein Monitor viel zu unempfindlich. Nachdem ich Ereignis-Hooks für den gesamten Inhalt von Manipulationsereignissen entfernt habe, nur die Hooks im übergeordneten Grid belassen habe und dann SEHR hart mit zwei Fingern auf dem Bildschirm gedrückt habe, habe ich die Ereignisse ausgelöst. Vermutlich muss man sich aber etwas mehr mit dem Routing herumschlagen.

Verwandte Themen