2012-04-09 20 views
5

タッチスクリーン用にWPFで開発するのが初めてで、操作イベントの解釈に問題があります。私がしたいことはかなりシンプルです。ユーザーがUserControlのどこにいても、アクションが実行されます。操作イベントが起動しない

だから、私が持っているコントロールに(これは、表面2.0/Windowsタッチです):

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 
} 

、これらのどちらも私は画面上のすべての手をこするときにイベントが発生します。私はこの状況でのイベントのルーティングを理解してはいけないと思う。私のモニター(3M MicroTouch PX)は、ScatterViewItemsのようなタッチイベントや組み込み操作を理解するのに問題がありませんでした。

EDIT:グリッドの内側からコントロールを削除しましたが、これは今すぐ起動します。そのため、操作がコンテンツによって傍受されているようです。申し訳ありませんが、コントロールの内容については、明らかになっているはずです。

具体的には、SurfaceListBoxが内部にあるという事実と関係していると思います。 SurfaceListBoxが操作をインターセプトしていると思います。私はそれを踏み出す方法がありますか?私はまだWPFがイベントを行う方法の周りに私の頭をラップしようとしています。

Edit2:より完全なコードを貼り付けるつもりです。 FULL

SEMANTICPANEL.XAML FULL

<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

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> 

A)はい、私はセマンティックズームをエミュレートしようとしていると、b)はい、私はそれをハック仕事をやっているので、ちょうど私を判断しないでください。私は単純な作業コンセプトが必要です。各ビューは、基本的にはカテゴリビューに似ています。

+0

なぜe.ManipulationContainerを変更しますか? –

+0

また、グリッドの領域で画面をタッチしてもよろしいですか?それは十分に大きいですか? –

+0

@AndriyBuday:私は本当に知らない、それは私が見たサンプルの一部だった。それは決して呼び出されていないので違いはありませんが、私は事を解決するまでコメントします。グリッドは現在フルスクリーンで表示されており、背景色で確認できます。だから少なくとも私はそれを逃していません。 –

答えて

0

あなたのお手伝いをしていただきありがとうございます。しかし、問題は私のモニターがあまりにも敏感ではないほど簡単だったようです。操作イベントのすべてのコンテンツのイベントフックを削除した後、親グリッドにフックだけを残してから、画面上で2本の指でVERYを強く押すと、イベントが発生しました。しかし、おそらくもう少しルーティングを混乱させる必要があります。

関連する問題