Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用XAML和C根据当前位置选择垂直ListView项?_C#_Xaml_Windows 8_Winrt Xaml - Fatal编程技术网

C# 如何使用XAML和C根据当前位置选择垂直ListView项?

C# 如何使用XAML和C根据当前位置选择垂直ListView项?,c#,xaml,windows-8,winrt-xaml,C#,Xaml,Windows 8,Winrt Xaml,我想做些棘手的事。我想通过确定ScrollViewer是否被滚动以及该项是否位于ScrollViewer的中心来选择列表项。我想在用户手动将项目滚动到ListView的中心时选择该项目。我不想滚动到所选项目,因为那太容易了,对吗 这是一张图: 我已设法检测到滚动条是否已被滚动。首先,我将加载的事件放在ListView的问题项列表上,通过遍历可视化树来查找ScrollViewer类型,查看它是否已完成滚动,并将ScrollViewer标记到ListView,并处理SelectionChanged事

我想做些棘手的事。我想通过确定ScrollViewer是否被滚动以及该项是否位于ScrollViewer的中心来选择列表项。我想在用户手动将项目滚动到ListView的中心时选择该项目。我不想滚动到所选项目,因为那太容易了,对吗

这是一张图:

我已设法检测到滚动条是否已被滚动。首先,我将加载的事件放在ListView的问题项列表上,通过遍历可视化树来查找ScrollViewer类型,查看它是否已完成滚动,并将ScrollViewer标记到ListView,并处理SelectionChanged事件:

private void ItemsList_OnLoaded(object sender, RoutedEventArgs e)
{
  var listView = (sender as ListView);
  if (listView != null)
  {
    var scrollers = FindVisualChildren<ScrollViewer>(sender as DependencyObject);
    var scrollView = scrollers.First();
    if (scrollView != null)
    {
      scrollView.Tag = listView;
      scrollView.ViewChanged += ScrollViewOnViewChanged;
      listView.SelectionChanged += listView_SelectionChanged;
    }
  }
}

public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
  if (depObj != null)
  {
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
      if (child != null && child is T)
      {
        yield return (T)child;
      }

      foreach (T childOfChild in FindVisualChildren<T>(child))
      {
        yield return childOfChild;
      }
    }
  }
}
然后是SelectionChanged事件,在该事件中我实现了一些神奇的效果:

void listView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
  Debug.WriteLine("SelectionChanged");
}

谢谢!任何帮助都将不胜感激

> p>您可以通过使用ScRelVIEWS.< /P>的方法来获取中间项目。 例如:

IInputElement element = scrollViewer.InputHitTest(
    new Point(scrollViewer.Width / 2, scrollViewer.Height / 2));

明天我将对此进行实验,并公布结果。我可能有一些后续问题。IInputElement接口似乎没有为WinRT公开。我现在正在寻找一个等价物。虽然这个实现会很好,但是WinRT没有IInputElement类,所以我修改了这个概念,并能够创建一个合适的命中测试。虽然我现在需要在当前列表项和上一列表项之间创建交叉淡入淡出动画,但WinRT是否实际具有InputItTest方法?返回类型是什么?不,不是。我们需要定义UIElement,找到它的父元素或子元素,然后从那里开始。
IInputElement element = scrollViewer.InputHitTest(
    new Point(scrollViewer.Width / 2, scrollViewer.Height / 2));