相机缩放值赋值会引发System.Argument异常

时间:2015-04-21 14:44:12

标签: c# windows-phone-8.1

我正在使用Windows Phone 8.1中的相机应用程序,我使用标准屏幕捏合/扩展手势实现了缩放。相机的预览链接到CaptureElement,其中附加了ManipulationDelta事件处理程序。以下代码工作正常:

private MediaCapture CameraManager;
//initialize CameraManager

private void BaseCanvas_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
    float zoomFactor = (float)(Math.Round(e.Delta.Expansion / (CameraManager.VideoDeviceController.ZoomControl.Step * 300), 0) * CameraManager.VideoDeviceController.ZoomControl.Step);
    Debug.WriteLine("Zoom factor: " + zoomFactor);
    ZoomFunction(zoomFactor);
}

private void ZoomFunction(float zoomFactor)
{
   if (CameraManager.VideoDeviceController.ZoomControl.Value + zoomFactor < CameraManager.VideoDeviceController.ZoomControl.Max && CameraManager.VideoDeviceController.ZoomControl.Value + zoomFactor > CameraManager.VideoDeviceController.ZoomControl.Min)
   {
        CameraManager.VideoDeviceController.ZoomControl.Value = CameraManager.VideoDeviceController.ZoomControl.Value + zoomFactor;
   }
}

问题是,我希望能够从事件处理程序外部调用ZoomFunction并以固定数量放大/缩小。所以我只是尝试了这个:

ZoomFunction(0.1F);

但是,当上述调用到达System.Argument if块内的代码行时,会引发ZoomFunction异常并附加“参数不正确”信息。我尝试了不同的变体,如ZoomFunction((float)(0.1))等等,但似乎没有任何效果。

显然这个论点出了问题,因为这是两个电话之间的唯一区别,但我似乎无法弄清楚是什么。这不是争论的重要性,因为我已对其进行检查以确保它不超过相机的缩放值限制。此外,我尝试使用通常由事件处理程序生成的值,但它们似乎没有任何区别。

解: 事实证明,缩放值必须是最小步长的整数倍,可以通过访问CameraManager.VideoDeviceController.ZoomControl.Step找到。我简单地将0.1四舍五入到步长的最接近的倍数,并且该函数现在工作正常。

1 个答案:

答案 0 :(得分:3)

您遇到的问题是对缩放系数设置了限制的结果。您的缩放系数设置为0.1,这不是ZoomControl.Step的整数倍。这就是您收到parameter is incorrect错误的原因(授予错误消息可能会提供更多信息)。有关此问题的详细信息,请访问this链接。正如您所知,解决方案是使用整数作为缩放值,特别是步进频率的倍数(顺便说一下,如果步进频率为1,则应该只有能够将1的倍数作为有效缩放系数(即1,2,3等),因为根据您的步频,这些是唯一有效的步骤。)

只是为了添加更多信息以防链接失效,文章指出“如果StepFrequency不等于ZoomControl.Step”,你会得到你遇到的同样的异常。 (在文章中,StepFrequency是根据滑块增加缩放的值 - 这类似于您尝试应用的手动缩放系数)。如果文章说“如果StepFrequency不是ZoomControl.Step的倍数”,也许会更准确,但至少它引导我们找到解决方案。