タッチスクリーン用に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)はい、私はそれをハック仕事をやっているので、ちょうど私を判断しないでください。私は単純な作業コンセプトが必要です。各ビューは、基本的にはカテゴリビューに似ています。
なぜe.ManipulationContainerを変更しますか? –
また、グリッドの領域で画面をタッチしてもよろしいですか?それは十分に大きいですか? –
@AndriyBuday:私は本当に知らない、それは私が見たサンプルの一部だった。それは決して呼び出されていないので違いはありませんが、私は事を解決するまでコメントします。グリッドは現在フルスクリーンで表示されており、背景色で確認できます。だから少なくとも私はそれを逃していません。 –