Xaml MasterDetailView UWP-访问列表视图(或使其滚动)

Xaml MasterDetailView UWP-访问列表视图(或使其滚动),xaml,uwp,c#-3.0,master-detail,windows-community-toolkit,Xaml,Uwp,C# 3.0,Master Detail,Windows Community Toolkit,我最近发现了UWP社区工具包,我很喜欢它。我现在使用的是MasterDetailView,它几乎完美地满足了我的需要:但它缺少一件重要的事情:我无法访问内部的“ListView” 在我的应用程序中,我有两个按钮:前进和后退,当按下它们时,我只需在列表中前进和后退。我发现了一个访问prev/next元素的技巧,如下所示: public void GoForward() { if (MasterDetailView.Items.Count > 0) {

我最近发现了UWP社区工具包,我很喜欢它。我现在使用的是
MasterDetailView
,它几乎完美地满足了我的需要:但它缺少一件重要的事情:我无法访问内部的“ListView”

在我的应用程序中,我有两个按钮:前进和后退,当按下它们时,我只需在列表中前进和后退。我发现了一个访问prev/next元素的技巧,如下所示:

public void GoForward()
    {
        if (MasterDetailView.Items.Count > 0)
        {
            bool isNextGood = false;
            MyItem selectedItem = MasterDetailView.Items[MasterDetailView.Items.Count - 1] as MyItem;

            foreach (var v in MasterDetailView.Items)
            {
                if (isNextGood)
                {
                    selectedItem = v as MyItem;
                    break;
                }

                if (v == MasterDetailView.SelectedItem)
                    isNextGood = true;
            }

            MasterDetailView.SelectedItem = selectedItem;
        }
    }
private void List_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ListView list = sender as ListView;
            list.ScrollIntoView(list.SelectedItem);
        }
这只是因为我无法访问“SelectedIndex”,而且我只有SelectedItem可用。现在,显然不是所有的项目都可以同时看到,所以MasterDetailView提供了一个带有滚动条的横向列表视图。按“我的下一个/上一个”按钮时,SelectedItem会更改,但不会在选定元素处滚动:选择会向前/向后移动,但列表会锁定。这会产生非常负面的反馈,因为我在列表中的某个地方丢失了我的选择,我必须搜索它

我想怎么解决它?我尝试以下方法:


1) 查找MasterDetailView的样式。在里面我找到了一个ListViewStyle,所以我尝试将它放入一个简单的“SelectionChanged”事件中,并在App.xaml.cs中处理它

<ListView x:Name="MasterList"
                                      Grid.Row="1"
                                      IsTabStop="False"
                                      ItemContainerStyle="{TemplateBinding ItemContainerStyle}"
                                      ItemTemplate="{TemplateBinding ItemTemplate}"
                                      ItemTemplateSelector="{TemplateBinding ItemTemplateSelector}"
                                      ItemsSource="{TemplateBinding ItemsSource}"
                                      SelectedItem="{Binding SelectedItem, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                                      SelectionChanged="MasterList_SelectionChanged"/>
但是,如前所述,“不能在应用程序类XAML文件中设置事件”


2) 考虑使用SelectedItem的父项:我尝试在ListViewItem中转换SelectedItem,然后访问父项,但在第一次转换时失败,因为SelectedItem似乎不是ListViewItem,但属于“MyItem”类型。这样,我无法访问父级

private void MasterDetailView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var item = MasterDetailView.SelectedItem as ListViewItem;
        var parent = item.Parent;
        var list = parent as ListView;
    }

所以我在这里。。。我不想为了传递给另一个控件而放弃我在MasterDetailView中的所有工作。有什么简单的方法可以访问列表,或者在我更改选择时滚动列表?只想做一件事,像这样:

public void GoForward()
    {
        if (MasterDetailView.Items.Count > 0)
        {
            bool isNextGood = false;
            MyItem selectedItem = MasterDetailView.Items[MasterDetailView.Items.Count - 1] as MyItem;

            foreach (var v in MasterDetailView.Items)
            {
                if (isNextGood)
                {
                    selectedItem = v as MyItem;
                    break;
                }

                if (v == MasterDetailView.SelectedItem)
                    isNextGood = true;
            }

            MasterDetailView.SelectedItem = selectedItem;
        }
    }
private void List_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ListView list = sender as ListView;
            list.ScrollIntoView(list.SelectedItem);
        }
当选择发生更改时,只需滚动到选择中,但我没有简单的ListView,只有MasterDetailView控件。即使它完全是在XAML中完成的:对我来说,最重要的事情就是让这个列表滚动

谢谢


解决方案 这个方法太棒了。复制粘贴即可

public static T FindChildOfType<T>(DependencyObject root) where T : class
    {
        var queue = new Queue<DependencyObject>();
        queue.Enqueue(root);
        while (queue.Count > 0)
        {
            DependencyObject current = queue.Dequeue();
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(current); i++)
            {
                var child = VisualTreeHelper.GetChild(current, i);
                var typedChild = child as T;
                if (typedChild != null)
                {
                    return typedChild;
                }
                queue.Enqueue(child);
            }
        }
        return null;
    }
public static T FindChildOfType(DependencyObject根目录),其中T:class
{
var queue=新队列();
queue.Enqueue(root);
而(queue.Count>0)
{
DependencyObject当前=queue.Dequeue();
for(int i=0;i
然后简单地使用它来检索列表并使其滚动。是的,宝贝

private void MasterDetailView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var v = FindChildOfType<ListView>(MasterDetailView);
        v.ScrollIntoView(MasterDetailView.SelectedItem);
    }
private void MasterDetailView\u SelectionChanged(对象发送者,selectionchangedventargs e)
{
var v=FindChildOfType(主详细视图);
v、 滚动至视图(MasterDetailView.SelectedItem);
}
请注意,“MasterView”是我的元素的x:Name,而不是类。

您可以使用FindChildOfType实现通过VisualTreeHelper获取列表视图,如以下回答所示:

MasterDetailsView
已将
选择更改为默认事件<代码>
Viajy Nirmal:是的,是的。但是它没有什么特别的用途。您可以像往常一样检索SelectedItem(这是一个MyItem对象)和my对象列表,但不能检索ListView或ScrollingEvents。所以这没用。我无法使用此事件检索列表。我知道它存在,但我无法访问列表本身来控制滚动。是的,就是它!我会立即更新答案!