操纵事件未触发

时间:2012-04-09 20:56:04

标签: wpf pixelsense

我是WPF开发触摸屏的新手,我在解释操作事件方面遇到了麻烦。我想做的事情相当简单:当用户捏住UserControl上的任何地方时,它会执行一个动作。

所以,在我的控件中(这是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
}

但是,当我在屏幕上搓手时,这些事件都不会触发。我想在这种情况下我不能理解事件的路由。我的显示器(3M MicroTouch PX)在ScatterViewItems中理解触摸事件或内置操作时没有任何问题。

编辑:我从网格内部删除了控件,然后他们现在开火,所以我猜测内容正在拦截操纵。对不起,应该更清楚控件的内容,因为它们似乎是问题所在。

具体来说,我认为这与我在里面有一个SurfaceListBox的事实有关。我想象SurfaceListBox是拦截操作。有没有办法告诉它要走开?我仍然试图围绕WPF做事件的方式。

Edit2:要粘贴一些更完整的代码。

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 FULL

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)是的我正在做一个hacky的工作。我只需要一个简单的工作概念。每个视图基本上类似于CategoryView。

1 个答案:

答案 0 :(得分:0)

感谢您对Andriy的帮助,但看起来问题就像我的显示器太麻木了一样简单。在我删除操作事件中所有内容的事件挂钩后,只留下父网格中的挂钩,然后用两根手指在屏幕上用力按压,我就把事件发射了。不过,可能需要更多地使用路由。