ScrollViewer ChangeView - AccessViolationException中的一千次

时间:2013-10-02 20:16:19

标签: windows-runtime

我使用ScrollViewer,Image(在ScrollViewer中作为DataTemplate)使用FlipView(用Mode="Standard"虚拟化)。我使用以下代码在Image上设置ImageOpened事件处理程序:

private void Image_ImageOpened(object sender, RoutedEventArgs e)
{
    var image = sender as Image;

    double width = image.ActualWidth;
    double height = image.ActualHeight;
    var sv = image.Parent as ScrollViewer;

    if (sv != null && width != 0 && height != 0)
    {
        var properZoom = ZoomUtilities.CalculateZoomFactor(width, height);
        sv.MinZoomFactor = 0.3f;
        sv.ChangeView(null, null, properZoom);
        sv.MinZoomFactor = properZoom;                
    }
}

properZoom始终是正确的值。当我更改项目(滑动)或加载页面时,有一千次因此FlipView应用程序崩溃,sv.ChangeView(..)上的断点和AccessViolationException异常被抛出。有谁知道这种行为的原因是什么?我可以拨打ChangeView方法时有任何限制吗?

编辑: 忘了提 - ScrollViewer上还有DoubleTapped事件处理程序,它也调用ChangeView

2 个答案:

答案 0 :(得分:2)

我使用.ChangeView(..)获得了相同的AccessViolationException。我注意到当我想操作的ScrollViewer有焦点时抛出了异常。例如,当用户拖动列表或使用鼠标控制滚动条时。

禁用动画解决了我的问题。如果要保留动画,则应在更改视图之前寻找一种方法来消除控件上的焦点。我想动画的ChangeView会尝试更改因用户输入而被锁定的属性。

希望这有帮助。

答案 1 :(得分:1)

我遇到了同样的问题。 我的解决方案:调用inverse,从image对象到parent得到错误。 调用普通路径:objectscroolviewer.changeview,不起作用。 然后:

var sv = image.Parent as ScrollViewer;

更改为

var sv = ScrollViewerObject; 

从外部获取对象变量,而不是父项的内部引用,并忽略发送者参数。