设备上未触发Windows Phone 8.1 ListView项模板网格保持事件
我有一个绑定的ListView,它使用网格作为ItemTemplate。网格有一个由保持事件触发的菜单输出。在emulator中,一切正常,但在设备上运行(带有Windows 8.1更新的Lumia 635),网格保持事件不会触发 如果我向ListView添加一个保持事件,这个事件将触发,但是我没有对被保持的项目的引用 要复制,1)将其添加到默认页面的主页标签中设备上未触发Windows Phone 8.1 ListView项模板网格保持事件,listview,grid,windows-phone-8.1,datatemplate,Listview,Grid,Windows Phone 8.1,Datatemplate,我有一个绑定的ListView,它使用网格作为ItemTemplate。网格有一个由保持事件触发的菜单输出。在emulator中,一切正常,但在设备上运行(带有Windows 8.1更新的Lumia 635),网格保持事件不会触发 如果我向ListView添加一个保持事件,这个事件将触发,但是我没有对被保持的项目的引用 要复制,1)将其添加到默认页面的主页标签中 <Page.Resources> <Style TargetType="TextBlock" x:Key=
<Page.Resources>
<Style TargetType="TextBlock" x:Key="GridText">
<Setter Property="FontSize" Value="20" />
<Setter Property="FontWeight" Value="Normal" />
<Setter Property="HorizontalAlignment" Value="Center" />
</Style>
</Page.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ScrollViewer HorizontalAlignment="Stretch" Grid.Row="0" Margin="10" x:Name="scrollRecord" Background="DarkMagenta">
<TextBlock x:Name="textRecord" FontSize="18" />
</ScrollViewer>
<ScrollViewer HorizontalAlignment="Stretch" Grid.Row="1" Margin="10">
<ListView x:Name="listView" HorizontalAlignment="Stretch">
<ListView.ItemTemplate>
<DataTemplate>
<Grid HorizontalAlignment="Stretch" Holding="Grid_Holding">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<FlyoutBase.AttachedFlyout>
<MenuFlyout>
<MenuFlyoutItem x:Name="buttonTick"
Text="Add"
Click="buttonAdd_Click"/>
<MenuFlyoutItem x:Name="buttonUntick"
Text="Remove"
Click="buttonRemove_Click"/>
</MenuFlyout>
</FlyoutBase.AttachedFlyout>
<TextBlock Style="{StaticResource GridText}" Grid.Column="0" Text="{Binding Colour}" />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ScrollViewer>
</Grid>
}
类RouteList:ObservableCollection//ElementCollection
{
}
routelistroutes;
已加载无效主页(对象发送器、路由目标)
{
路由=新路由列表();
路线。添加(新路线(“红色”));
路线。添加(新路线(“橙色”);
路线。添加(新路线(“粉色”);
路线。添加(新路线(“蓝色”));
路线。添加(新路线(“紫色”);
listView.ItemsSource=路由;
//DataTemplate t=listView.ItemTemplate;
//AddText(“网格布局保持)
}
///
///当此页面即将显示在框架中时调用。
///
///描述如何到达此页面的事件数据。
///此参数通常用于配置页面。
受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e)
{
//TODO:准备在此处显示的页面。
//TODO:如果应用程序包含多个页面,请确保
//通过注册来处理硬件后退按钮
//Windows.Phone.UI.Input.HardwareButtons.BackPressed事件。
//如果您正在使用某些模板提供的NavigationHelper,
//此事件已为您处理。
}
私有无效网格保持(对象发送方,保持路由目标)
{
尝试
{
AddText(“Grid_Holding fired”+e.HoldingState.ToString());
//显示弹出按钮(发送者);
}
捕获(例外情况除外)
{
添加文本(例如消息);
}
}
专用void ShowFlyout(对象发送者)
{
FrameworkElement senderElement=发送方作为FrameworkElement;
FlyoutBase FlyoutBase=FlyoutBase.GetAttachedFlyout(senderElement);
飞出基地。ShowAt(senderElement);
}
私有void AddText(字符串s)
{
Text记录。Text+=s+“\n”;
//scrollRecord.ScrollToVerticalOffset(scrollRecord.ScrollableHeight);
scrollRecord.ChangeView(0,scrollRecord.ScrollableHeight,1.0f,false);
}
私有无效按钮单击(对象发送者,路由目标)
{
尝试
{
添加文本(“添加…”);
MenuFlyoutItem=发送方作为MenuFlyoutItem;
Route Route=m.DataContext作为路由;
if(路由!=null)
{
字符串颜色=路由。颜色+“+”;
路线。添加(新路线(颜色));
}
}
捕获(例外情况除外)
{
添加文本(例如消息);
}
添加文本(“完成”);
}
私有无效按钮删除\单击(对象发送者,路由目标)
{
MenuFlyoutItem=发送方作为MenuFlyoutItem;
Route Route=m.DataContext作为路由;
if(路由!=null)
{
路线。移除(路线);
}
}
私有无效列表视图(对象发送方、HoldingRoutedEventArgs e)
{
尝试
{
AddText(“listView_Holding fired”+e.HoldingState.ToString());
//显示弹出按钮(发送者);
}
捕获(例外情况除外)
{
添加文本(例如消息);
}
}
经过所有这些努力,我重新启动了手机,现在它工作正常。它工作了一段时间。在我的手机上捕获保持事件似乎是间歇性的,而模拟器每次都工作。捕获listview的保持事件工作得很好,所以我可以使用它,但网格的保持事件会更有用,我昏昏欲睡!事实证明,在使用emulator时,我总是在网格中单击文本。当我使用手指时,我通常不直接在文本上方,因此网格保持不会被触发。下面的xaml显示了这一点。一个修复方法是添加一个background=“Red”“到网格。透明背景不会捕获事件。我想我记得这是以前的事——也许是silverlight的画布。
public Route()
{
}
public Route(string colour)
{
Colour = colour;
}
[DataMember]
public string Colour { get; set; }
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, e);
}
protected void OnPropertyChanged(string propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
RouteList routes;
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
routes = new RouteList();
routes.Add(new Route("Red"));
routes.Add(new Route("Orange"));
routes.Add(new Route("Pink"));
routes.Add(new Route("Blue"));
routes.Add(new Route("Violet"));
listView.ItemsSource = routes;
//DataTemplate t = listView.ItemTemplate;
//AddText("gridLayout holding)
}
/// <summary>
/// Invoked when this page is about to be displayed in a Frame.
/// </summary>
/// <param name="e">Event data that describes how this page was reached.
/// This parameter is typically used to configure the page.</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// TODO: Prepare page for display here.
// TODO: If your application contains multiple pages, ensure that you are
// handling the hardware Back button by registering for the
// Windows.Phone.UI.Input.HardwareButtons.BackPressed event.
// If you are using the NavigationHelper provided by some templates,
// this event is handled for you.
}
private void Grid_Holding(object sender, HoldingRoutedEventArgs e)
{
try
{
AddText("Grid_Holding fired " + e.HoldingState.ToString());
//ShowFlyout(sender);
}
catch (Exception ex)
{
AddText(ex.Message);
}
}
private void ShowFlyout(object sender)
{
FrameworkElement senderElement = sender as FrameworkElement;
FlyoutBase flyoutBase = FlyoutBase.GetAttachedFlyout(senderElement);
flyoutBase.ShowAt(senderElement);
}
private void AddText(string s)
{
textRecord.Text += s + "\n";
//scrollRecord.ScrollToVerticalOffset(scrollRecord.ScrollableHeight);
scrollRecord.ChangeView(0, scrollRecord.ScrollableHeight,1.0f,false);
}
private void buttonAdd_Click(object sender, RoutedEventArgs e)
{
try
{
AddText("Adding...");
MenuFlyoutItem m = sender as MenuFlyoutItem;
Route route = m.DataContext as Route;
if (route != null)
{
string colour = route.Colour + "+";
routes.Add(new Route(colour));
}
}
catch (Exception ex)
{
AddText(ex.Message);
}
AddText("Finished");
}
private void buttonRemove_Click(object sender, RoutedEventArgs e)
{
MenuFlyoutItem m = sender as MenuFlyoutItem;
Route route = m.DataContext as Route;
if (route != null)
{
routes.Remove(route);
}
}
private void listView_Holding(object sender, HoldingRoutedEventArgs e)
{
try
{
AddText("listView_Holding fired " + e.HoldingState.ToString());
//ShowFlyout(sender);
}
catch (Exception ex)
{
AddText(ex.Message);
}
}