2012-04-09 59 views
5

Tôi mới phát triển trong WPF cho màn hình cảm ứng và tôi đang gặp sự cố khi diễn giải các sự kiện thao tác. Những gì tôi muốn làm là khá đơn giản, tôi tin rằng: khi người dùng pinches bất cứ nơi nào trên một UserControl, nó sẽ thực hiện một hành động.Thao tác thao tác không kích hoạt

Vì vậy, trong việc kiểm soát tôi có (đây là Surface 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 
} 

Tuy nhiên, không ai trong số những sự kiện cháy khi tôi chà tay trên màn hình. Tôi nghĩ tôi không hiểu định tuyến của sự kiện trong tình huống này. Màn hình của tôi (3M MicroTouch PX) đã không gặp bất kỳ sự cố nào khi hiểu sự kiện cảm ứng hoặc thao tác tích hợp như trong ScatterViewItems.

CHỈNH SỬA: Tôi đã xóa các điều khiển từ bên trong lưới và chúng hiện đang kích hoạt, vì vậy tôi đoán các thao tác đang bị chặn bởi nội dung. Xin lỗi, phải rõ ràng hơn về nội dung của kiểm soát, bởi vì chúng có vẻ như là vấn đề.

Cụ thể tôi nghĩ rằng nó đã làm với thực tế là tôi có một SurfaceListBox bên trong. Tôi sẽ tưởng tượng SurfaceListBox đang chặn thao tác. Có cách nào tôi có thể nói nó bước ra? Tôi vẫn đang cố gắng quấn quanh đầu WPF.

Chỉnh sửa2: Sẽ dán một số mã hoàn chỉnh hơn.

SEMANTICPANEL.XAML ĐẦY ĐỦ

<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 ĐẦY ĐỦ

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> 

Chỉ cần đừng phán xét tôi bởi vì a) vâng tôi đang cố gắng để bắt chước Semantic Zoom và b) có tôi đang làm một công việc hacky của nó. Tôi chỉ cần một khái niệm làm việc đơn giản. Mỗi khung nhìn về cơ bản tương tự như CategoryView.

+0

Tại sao bạn thay đổi e.ManipulationContainer? –

+0

Ngoài ra bạn có chắc chắn rằng bạn chạm vào màn hình trong khu vực của lưới của chúng tôi? Có đủ lớn không? –

+0

@AndriyBuday: Tôi thực sự không biết, đó là một phần của một mẫu mà tôi đã xem. Không tạo nên sự khác biệt vì nó không bao giờ được gọi, nhưng tôi sẽ bình luận nó cho đến khi tôi làm việc. Lưới ở chế độ toàn màn hình ngay bây giờ và màu nền xác nhận điều đó. Vì vậy, tôi không bỏ lỡ nó, ít nhất. –

Trả lời

0

Cảm ơn sự giúp đỡ của bạn Andriy, nhưng có vẻ như vấn đề đơn giản như màn hình của tôi quá nhạy cảm. Sau khi tôi gỡ bỏ các móc sự kiện cho tất cả nội dung trên các sự kiện thao tác, chỉ để lại các móc trong lưới cha, và sau đó nhấn VERY cứng bằng hai ngón tay trên màn hình, tôi nhận các sự kiện để kích hoạt. Có lẽ cần phải mess nhiều hơn một chút với định tuyến, mặc dù.