c# - 相机变焦值分配引发 System.Argument 异常

标签 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);

但是,上面的调用在到达 if block 内的代码行时抛出一个带有附加信息“参数不正确”的 System.Argument 异常缩放函数。我尝试了不同的变体,例如 ZoomFunction((float)(0.1)) 等等,但似乎没有任何效果。

显然这个论点有问题,因为这是两个调用之间的唯一区别,但我似乎无法弄清楚是什么。这不是参数的大小,因为我已经对其进行了检查以确保它不超过相机的变焦值限制。此外,我也尝试过使用通常由事件处理程序生成的值,但它们似乎也没有什么区别。

解决方案: 事实证明,缩放值必须是最小步长的整数倍,可通过访问 CameraManager.VideoDeviceController.ZoomControl.Step 找到。我只是将 0.1 舍入到最接近的步长倍数,现在函数可以正常工作了。

最佳答案

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

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

关于c# - 相机变焦值分配引发 System.Argument 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29775511/

相关文章:

c# - 存储 Windows 服务的配置和日志文件的最佳位置

c# - 使用 IP 地址打印到网络打印机

windows-phone-8 - Windows Phone 8.1/8 SDK

c# - Visual Studio 2010 调试器中的上下文变量

c# - 绑定(bind)到通用属性

javascript - 如何检测windowsphone是否有软键

c# - 如何在 C# 中修改 Cortana 语音激活命令 (XML)?

windows - 如何将 Windows Phone 应用程序复制到实际设备?

emulation - 确定 Windows Phone 8.1 应用程序是否正在模拟器中运行?

c# - 使用 C# 在字符串中查找具有频率的子字符串的最佳方法是什么?