Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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# ScrollIntoView不';我不能用触觉工作_C#_Scroll_Listbox_Touch_Pushpin - Fatal编程技术网

C# ScrollIntoView不';我不能用触觉工作

C# ScrollIntoView不';我不能用触觉工作,c#,scroll,listbox,touch,pushpin,C#,Scroll,Listbox,Touch,Pushpin,因此,我有一张地图,上面有许多图钉,右边有一个列表,列出了所有图钉(使用相同的视图模型) 当我点击地图上的一个图钉时,我想将该项目滚动到列表中的视图中 我目前在点击和点击时使用此代码: private void ScrollPushPin(Pushpin pushpin) { ScrollViewer scrollViewer = GetScrollViewer(MyList) as ScrollViewer; scrollViewer.ScrollToBottom();

因此,我有一张地图,上面有许多图钉,右边有一个列表,列出了所有图钉(使用相同的视图模型)

当我点击地图上的一个图钉时,我想将该项目滚动到列表中的视图中

我目前在点击和点击时使用此代码:

private void ScrollPushPin(Pushpin pushpin)
{
      ScrollViewer scrollViewer = GetScrollViewer(MyList) as ScrollViewer;
      scrollViewer.ScrollToBottom();
      var index = this.MyList.Items.IndexOf(pushpin);

      //index is never -1 so I would expect it to work?
      this.MyList.ScrollIntoView(pushpin); 
}
点击:

void pp_MouseDown(object sender, MouseButtonEventArgs e)
{
    ScrollPushPin(sender as PushPin);
}
void pp_TouchDown(object sender, TouchEventArgs e)
{
    var pushpin = (Pushpin)sender;
    pushpin.CaptureTouch(e.TouchDevice);
}

void pp_TouchUp(object sender, TouchEventArgs e)
{
   var pushpin = (Pushpin)sender;
    if (pushpin != null && e.TouchDevice.Captured == pushpin)
    {
        pushpin.ReleaseTouchCapture(e.TouchDevice);
        ScrollPushPin(pushpin);
    }
}
触摸屏:

void pp_MouseDown(object sender, MouseButtonEventArgs e)
{
    ScrollPushPin(sender as PushPin);
}
void pp_TouchDown(object sender, TouchEventArgs e)
{
    var pushpin = (Pushpin)sender;
    pushpin.CaptureTouch(e.TouchDevice);
}

void pp_TouchUp(object sender, TouchEventArgs e)
{
   var pushpin = (Pushpin)sender;
    if (pushpin != null && e.TouchDevice.Captured == pushpin)
    {
        pushpin.ReleaseTouchCapture(e.TouchDevice);
        ScrollPushPin(pushpin);
    }
}
当我用鼠标点击我的图钉时,这段代码运行良好,但触摸事件不会将图钉滚动到视图中,我不明白为什么

我也尝试过:

void pp_MouseDown(object sender, MouseButtonEventArgs e)
{
    ScrollPushPin(sender as PushPin);
}
void pp_TouchDown(object sender, TouchEventArgs e)
{
    var pushpin = (Pushpin)sender;
    pushpin.CaptureTouch(e.TouchDevice);
}

void pp_TouchUp(object sender, TouchEventArgs e)
{
   var pushpin = (Pushpin)sender;
    if (pushpin != null && e.TouchDevice.Captured == pushpin)
    {
        pushpin.ReleaseTouchCapture(e.TouchDevice);
        ScrollPushPin(pushpin);
    }
}


所以不要问我为什么这样做,但在我的事件末尾添加
e.Handled=true
解决了问题:

void pp_TouchDown(object sender, TouchEventArgs e)
{
    var pushpin = (Pushpin)sender;
    pushpin.CaptureTouch(e.TouchDevice);
    e.Handled = true
}

void pp_TouchUp(object sender, TouchEventArgs e)
{
   var pushpin = (Pushpin)sender;
    if (pushpin != null && e.TouchDevice.Captured == pushpin)
    {
        pushpin.ReleaseTouchCapture(e.TouchDevice);
        ScrollPushPin(pushpin);
    }
    e.Handled = true
}
编辑

添加
e.Handled=true
会导致更多问题,因此我决定编写自己的
ScrollIntoView

var val = this.MyList.Items.IndexOf(myObj);
if (val != -1)
{
    ScrollViewer scrollViewer = GetScrollViewer(MyList) as ScrollViewer;
    var itemHeight = scrollViewer.ExtentHeight / this.MyList.Items.Count;
    scrollViewer.ScrollToVerticalOffset(itemHeight * val);
}

//where
public static DependencyObject GetScrollViewer(DependencyObject o)
{
    if (o is ScrollViewer)
    { return o; }

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++)
    {
        var child = VisualTreeHelper.GetChild(o, i);

        var result = GetScrollViewer(child);
        if (result == null)
        {
            continue;
        }
        else
        {
            return result;
        }
    }

    return null;
}
var val=this.MyList.Items.IndexOf(myObj);
如果(val!=-1)
{
ScrollViewer ScrollViewer=GetScrollViewer(MyList)作为ScrollViewer;
var itemHeight=scrollViewer.ExtentHeight/this.MyList.Items.Count;
scrollViewer.ScrollToVerticalOffset(itemHeight*val);
}
//在哪里
公共静态DependencyObject GetScrollViewer(DependencyObject o)
{
如果(o是ScrollViewer)
{返回o;}
for(int i=0;i