拖拽在Windows 8商店应用程序(C#)中使用触摸手势删除VariableSizedWrapGrid项目

时间:2013-05-31 15:33:12

标签: windows-8 windows-store-apps winrt-xaml

更新: 我通过支持渠道从MS收到答复,当ItemPanelTemplate是VariableSizeWrapGrid时,目前无法支持触摸重新排序 - 因为它缺少实现所需的某些接口。

作为前言(并消除任何误解),我确实使用鼠标所需的功能。我只需要通过触摸手势实现相同的功能。

要求: 1.在水平可滚动容器中显示一组项目,每个项目可以是半高或全高。应该可以通过在新位置拖放来重新排列它们。 2.为用户提供取消选择先前所选项目的方法(与使用鼠标右键单击的效果相同)。

我目前的代码:

XAML(为清晰起见略微简化)

    <ScrollViewer HorizontalAlignment="Stretch" 
                  HorizontalScrollBarVisibility="Auto" 
                  VerticalScrollBarVisibility="Hidden">
        <StackPanel Orientation="Horizontal" Height="600" 
                    ScrollViewer.VerticalScrollMode="Disabled">
            <controls:MyGridView ScrollViewer.VerticalScrollMode="Disabled"
                                 ItemsSource="{Binding Items}" 
                                 SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
                                 SelectionMode="Single" 
                                 IsSwipeEnabled="True" 
                                 CanDragItems="True" 
                                 CanReorderItems="True" 
                                 AllowDrop="True" 
                                 IsItemClickEnabled="False"
                                 Height="600">
                <GridView.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <ContentControl Content="{Binding}" 
                                            ContentTemplateSelector="{StaticResource ItemTemplateSelector}"/>
                        </Grid>
                    </DataTemplate>
                </GridView.ItemTemplate>

                <GridView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VariableSizedWrapGrid ItemHeight="300" 
                                               ItemWidth="300" 
                                               Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </GridView.ItemsPanel>

                <GridView.ItemContainerStyle>
                    <Style TargetType="GridViewItem">
                        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                        <Setter Property="VerticalContentAlignment" Value="Stretch"/>
                    </Style>
                </GridView.ItemContainerStyle>
            </controls:DashletsGridView>
        </StackPanel>
    </ScrollViewer>

MyGridView类是GridViewEx的扩展,它是this sample的一部分。 它对基类的唯一补充是:

    protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item)
    {
        try
        {
            Item d = item as Item;
            if (d != null)
            {
                element.SetValue(VariableSizedWrapGrid.RowSpanProperty, d.Size == PossibleSizes.Half ? 1 : 2);
            }
        }
        catch
        {
            element.SetValue(VariableSizedWrapGrid.RowSpanProperty, 2);
        }
        finally
        {
            base.PrepareContainerForItemOverride(element, item);
        }
    }

我尝试了各种各样的布局控件组合(例如消除外部ScrollViewer或StackPanel,或用网格替换它),但没有一个支持正确的水平滚动或项目大小调整。将GridView.ItemsPanel从VariableSizedWrapGrid切换到WrapGrid也无济于事。

请注意标志的组合: IsSwipeEnabled =“True”CanDragItems =“True”CanReorderItems =“True”AllowDrop =“True”IsItemClickEnabled =“False”。 这就是使用鼠标d&amp; d,但触摸d&amp; d或取消选择仍然没有运气。

1 个答案:

答案 0 :(得分:0)

除非GridView绑定到ItemsSourceObservableCollectionCanReorderItemsCanDragItems设置为AllowDrop,否则您无法对true重新排序CollectionViewSource。使用gridview启用collectionviewsource中的重新排序需要 。实际上,gridview通常用于对<Grid Background="Black"> <Grid.DataContext> <local:MyModel/> </Grid.DataContext> <GridView CanReorderItems="True" CanDragItems="True" AllowDrop="True" ItemsSource="{Binding Items}"> </GridView> </Grid> 进行分组,并且在对数据进行分组时无法进行重新排序。

无论如何,你的XAML看起来像这样:

enumerable

虽然任何ItemsSource都可以绑定到GridView的{​​{1}},但只有ObservableCollection才能重新排序。是的,您可以使用实现重新排序的自定义类型,但是为什么ObservableCollection为您执行此操作会导致其混乱?

这是我的回答here的摘录。

不要气馁。它比它看起来容易。

祝你好运!