1

我提前道歉,这个很难解释。

我有一个 GridView,里面装满了可选择的图块。进行选择时,通过将 IsOpen 和 IsSticky 设置为 true,将显示底部 AppBar。这工作正常。

但是,当 AppBar 在第一次选择后出现时,它会捕获任何触摸活动,然后在对 AppBar 外部区域进行任何触摸后将其释放,但该触摸手势会被吸收。我最终触摸屏幕两次以执行第二次选择。

在 Windows 8 的开始画面中,您可以无缝选择多个磁贴。出现的底部栏不会干扰后续的触摸手势。但是在我的应用程序中,该栏捕获了第一个手势,我最终选择了第二个图块两次。这让我的应用感觉反应迟钝。

我该如何解决?

要复制这个:

1) 在 Visual Studio 2012 的 Windows Store 下启动一个新的“Grid App (XAML)”。

2) 在 GroupedItemsPage.xaml 中,将以下 XAML 添加到其中:

<Page.BottomAppBar>
    <AppBar>
        <Button Content="X"/>
    </AppBar>
</Page.BottomAppBar>

3) 找到 x:Name="itemGridView" 的 GridView 并设置其SelectionMode="Extended"IsSwipeEnabled="true"

<GridView
    x:Name="itemGridView"
    AutomationProperties.AutomationId="ItemGridView"
    AutomationProperties.Name="Grouped Items"
    Grid.RowSpan="2"
    Padding="116,137,40,46"
    ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
    SelectionMode="Extended"
    IsSwipeEnabled="true"
    IsItemClickEnabled="True"
    ItemClick="ItemView_ItemClick">

4) 在代码隐藏文件中添加以下代码:

public GroupedItemsPage()
    {
        this.InitializeComponent();

        itemGridView.SelectionChanged += ItemGridViewOnSelectionChanged;
    }

    private void ItemGridViewOnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (itemGridView.SelectedItems.Count > 0)
        {
            this.BottomAppBar.IsOpen = true;
            this.BottomAppBar.IsSticky = true;
        }
        else
        {
            this.BottomAppBar.IsSticky = false;
            this.BottomAppBar.IsOpen = false;
        }
    }

5)运行它并注意在第一次选择之后出现应用栏,但随后您选择第二个图块的第二个手势被吸收了。

4

1 回答 1

1

信不信由你,解决方案真的很简单。您必须更改设置BottomAppBar.IsOpen和的顺序BottomAppBar.IsSticky

private void ItemGridViewOnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (itemGridView.SelectedItems.Count > 0)
    {
        //this.BottomAppBar.IsOpen = true;
        //this.BottomAppBar.IsSticky = true;

        // must be done in this order for the app bar to work correctly
        this.BottomAppBar.IsSticky = true;
        this.BottomAppBar.IsOpen = true;
    }
    else
    {
        //this.BottomAppBar.IsSticky = false;
        //this.BottomAppBar.IsOpen = false;

        // I have a note in my code to use the following order,
        // but ordering for this doesn't seem to matter.
        this.BottomAppBar.IsOpen = false;
        this.BottomAppBar.IsSticky = false;
    }
}

我不确定为什么排序很重要,但确实如此。

于 2013-01-22T14:45:34.917 回答