【问题标题】:ScrollViewer ChangeView - AccessViolationException one out of the thousand timesScrollViewer ChangeView - AccessViolationException 千分之一
【发布时间】:2013-10-02 20:16:18
【问题描述】:

我有 FlipView(它使用 Mode="Standard" 虚拟化)和 ScrollViewer、Image(在 ScrollViewer 中作为 DataTemplate)。我用这样的代码在 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

【问题讨论】:

    标签: windows-runtime


    【解决方案1】:

    我使用.ChangeView(..) 时遇到了相同的 AccessViolationException。我注意到当我想要操作的 ScrollViewer 具有焦点时引发了异常。例如,当用户在列表中拖动或用鼠标控制滚动条时。

    禁用动画解决了我的问题。如果您想保留动画,您应该在更改视图之前寻找一种方法来消除对控件的关注。我猜想动画的 ChangeView 会尝试更改由于用户输入而被锁定的属性。

    希望这会有所帮助。

    【讨论】:

    • 对于其他阅读本文的人,ChangeView 函数需要一个参数来禁用/启用动画。我相信这就是这个答案第二段中讨论的内容,但不是 100% 确定。
    【解决方案2】:

    我遇到了同样的问题。 对我的解决方案:调用 inverse,从图像对象到父对象出错。 调用正常路径:objectscroolviewer.changeview,没有错误。 那么:

    var sv = image.Parent as ScrollViewer;
    

    改成

    var sv = ScrollViewerObject; 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      相关资源
      最近更新 更多