Xaml UWP在Xbox上重新排序Gridviewitems

Xaml UWP在Xbox上重新排序Gridviewitems,xaml,gridview,uwp,xbox-one,reorderlist,Xaml,Gridview,Uwp,Xbox One,Reorderlist,我正在制作一个UWP应用程序,现在应该放在xbox上,将来可能会在pc和其他平台上发布。我知道在PC和移动设备上,我们可以通过GridView或ListView上的以下两个属性启用此功能 但根据微软文档的说法,拖放功能非常有用 那么,在xbox GridView上实现此重新排序功能还有哪些其他选项 更新1 这是我的gridview后端代码。选择模式是单一的,但我没有使用selectionchanged事件,因为这会造成很多混乱,现在假设我们总是需要交换项目,我将在交换工作正常后设置布尔值 您可以

我正在制作一个UWP应用程序,现在应该放在xbox上,将来可能会在pc和其他平台上发布。我知道在PC和移动设备上,我们可以通过GridView或ListView上的以下两个属性启用此功能

但根据微软文档的说法,拖放功能非常有用

那么,在xbox GridView上实现此重新排序功能还有哪些其他选项

更新1

这是我的gridview后端代码。选择模式是单一的,但我没有使用selectionchanged事件,因为这会造成很多混乱,现在假设我们总是需要交换项目,我将在交换工作正常后设置布尔值

您可以使用adaptivegridview或uwp的普通gridview来尝试代码,如果它可以使用,那么它也应该使用adaptivegridview

目前的Bheaviour项目已被互换,但焦点仍在同一指数上


预期焦点也会随着项目移动。

您的发现是正确的,Xbox开箱即用不支持拖放,尽管将来Xbox支持鼠标时,我想它会起作用

因此,如果您需要此功能,您必须从一开始就手动实现它。一个选项是添加一个按钮,该按钮将仅显示在Xbox上,并且读起来像重新排序网格

启用此重新排序模式后,可以使用多种解决方案

对您来说,最简单的解决方案是将SelectionMode设置为Single,当选择一个项目时,您可以将其带到基础集合的fromt

collection.Remove( selectedItem );
collection.Insert( 0, selectedItem );
这一领先解决方案是在Xbox One仪表板上实现的,用于重新排序磁贴

第二个选项是将SelectionMode设置为Multiple,用户首先选择一个项目,然后再选择第二个项目。之后,您可以将第一个选定项目移动到第二个选定项目之前:

collection.Remove( firstSelectedItem );
var targetIndex = collection.IndexOf( secondSelectedItem );
collection.Insert( targetIndex, firstSelectedItem );
最后一个解决方案是最复杂的。使用SelectionMode=Single,您可以选择单个项目,然后观察用户焦点移动的方向并实时移动互动程序。这是最用户友好的,但最难可靠地实现

正如第三个解决方案的概要一样,如果实现GridView的自定义模板,则可以捕获GotFocus事件:

现在将集合项类型更改为这个新的包装器类型。当然,您还必须更新GridView数据模板以获得正确的引用。现在需要使用{Binding TvShow.Property}而不是{Binding Property},或者可以将DataContext={Binding TvShow}属性设置为DataTemplate内的根元素

但你现在可以明白我要说的了。当前,您正在使用Move方法移动集合中的项。让我们将其替换为交换:

var item1 = focusedItem.TvShow;
focusedItem.TvShow = LostItem.TvShow;
LostItem.TvShow = item1;
这是一个很大的区别,因为我们不再更改集合本身,而只是将引用移动到包装在静态容器中的项。由于绑定,这些项目将正确地显示在它们应该显示的位置


这仍然是一个黑客解决方案,因为它要求您包装您的项目只是为了重新排序,但它至少可以工作。不过,我仍然对找到更好的方法感兴趣。

谢谢你的回答,我也在考虑做类似于第三种选择的事情,我知道这可能很复杂,但我们怎么做呢?有什么想法吗?我已经更新了我的答案,告诉你如何实现这一点为什么我要使用GotFocus?我的意思是,获取的焦点和选定的元素不是相同的吗?bcz当选择更改时,一个项目被选中,同时也获取了正确的焦点?如果我只在GRDIView上使用selectionchanged事件,然后将removeditem与args中的选定项目交换,会怎么样?这样行吗?或者我可以使用失去焦点和获得焦点,然后交换这两个元素?你有什么建议@马丁·齐克蒙德
collection.Remove( firstSelectedItem );
var targetIndex = collection.IndexOf( secondSelectedItem );
collection.Insert( targetIndex, firstSelectedItem );
<GridView.ItemsPanel>
    <ItemsPanelTemplate>
        <ItemsWrapGrid Orientation="Horizontal" 
                       GotFocus="GridViewItem_GotFocus"/>
    </ItemsPanelTemplate>
</GridView.ItemsPanel>
public class TVShowContainer : INotifyPropertyChanged
{
    private TVShow _tvShow;

    public TVShow TvShow
    {
        get => _tvShow;
        set
        {
            _tvShow = value; 
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
var item1 = focusedItem.TvShow;
focusedItem.TvShow = LostItem.TvShow;
LostItem.TvShow = item1;