我使用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
答案 0 :(得分:2)
我使用.ChangeView(..)
获得了相同的AccessViolationException。我注意到当我想操作的ScrollViewer有焦点时抛出了异常。例如,当用户拖动列表或使用鼠标控制滚动条时。
禁用动画解决了我的问题。如果要保留动画,则应在更改视图之前寻找一种方法来消除控件上的焦点。我想动画的ChangeView会尝试更改因用户输入而被锁定的属性。
希望这有帮助。
答案 1 :(得分:1)
我遇到了同样的问题。 我的解决方案:调用inverse,从image对象到parent得到错误。 调用普通路径:objectscroolviewer.changeview,不起作用。 然后:
var sv = image.Parent as ScrollViewer;
更改为
var sv = ScrollViewerObject;
从外部获取对象变量,而不是父项的内部引用,并忽略发送者参数。