Xaml UWP在Xbox上重新排序Gridviewitems
我正在制作一个UWP应用程序,现在应该放在xbox上,将来可能会在pc和其他平台上发布。我知道在PC和移动设备上,我们可以通过GridView或ListView上的以下两个属性启用此功能 但根据微软文档的说法,拖放功能非常有用 那么,在xbox GridView上实现此重新排序功能还有哪些其他选项 更新1 这是我的gridview后端代码。选择模式是单一的,但我没有使用selectionchanged事件,因为这会造成很多混乱,现在假设我们总是需要交换项目,我将在交换工作正常后设置布尔值 您可以使用adaptivegridview或uwp的普通gridview来尝试代码,如果它可以使用,那么它也应该使用adaptivegridview 目前的Bheaviour项目已被互换,但焦点仍在同一指数上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事件,因为这会造成很多混乱,现在假设我们总是需要交换项目,我将在交换工作正常后设置布尔值 您可以
预期焦点也会随着项目移动。您的发现是正确的,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;