在 WP 上使用 MvvmCross 拍摄图像并显示图像时出现问题

2024-01-04

我想用相机拍照并将其显示在我所在的页面上

所以我有一个 ViewModel,我可以在其中拍照并显示它

public class CamViewModel : MvxViewModel,
    IMvxServiceConsumer<IInstalledMeter>,
    IMvxServiceConsumer<ICamaraService>        
{
    public CamViewModel()
    {
        this.GetService<ICamaraService>().PhotoSavedEvent += PhotoSaved;

        if (!String.IsNullOrEmpty(this.GetService<IInstalledMeter>().ImagePath))
        {
            ImagePath = this.GetService<IInstalledMeter>().ImagePath;
        }

        TakePicture();
    }

    private string _imagePath;
    public string ImagePath
    {
        get { return _imagePath; }
        set { _imagePath = value; FirePropertyChanged("ImagePath"); }
    }

    //Navigate back to InstallUnit
    public IMvxCommand OpenCamaraCommand
    {
        get
        {
            return new MvxRelayCommand(TakePicture);
        }
    }

    private void PhotoSaved(object sender, PhotoSavedResultEventArgs e)
    {
        ImagePath = e.ImagePath;
    }

    private void TakePicture()
    {
        this.GetService<ICamaraService>().TakePhoto();
    }
}

这使用了 CameraService 来拍摄照片并将照片保存在独立的存储中(我知道,问题分离不好)

public class CamaraService : IMvxServiceConsumer<IMvxPictureChooserTask>, IMvxServiceConsumer<IMvxSimpleFileStoreService>, IMvxServiceConsumer<IInstalledMeter>, ICamaraService
{
    private const int MaxPixelDimension = 1024;
    private const int DefaultJpegQuality = 70;

    public event EventHandler<PhotoSavedResultEventArgs> PhotoSavedEvent;
    private void PhotoTaken(PhotoSavedResultEventArgs e)
    {
        if (PhotoSavedEvent != null)
        {
            PhotoSavedEvent(this, e);
        }
    }

    public string ImagePath { get; set; }

    public void TakePicture()
    {
        this.GetService<IMvxPictureChooserTask>().TakePicture(
            MaxPixelDimension, 
            DefaultJpegQuality,
            SavePicture, 
            () => { /* cancel is ignored */ });
    }
    public void TakePhoto()
    {
        TakePicture();
    }

    public void SavePicture(Stream image)
    {
        var newImage = Save(image);
        if (newImage != "")
        {
            DeleteOldImage(this.GetService<IInstalledMeter>().ImagePath);
            this.GetService<IInstalledMeter>().ImagePath = newImage;
            PhotoTaken(new PhotoSavedResultEventArgs {ImagePath = newImage});
        }
    }

    public void UpdateModel(string filename)
    {

    }

    public void DeleteOldImage(string fileName)
    {
        try
        {
            if (String.IsNullOrEmpty(fileName)) return;
            var fileService = this.GetService<IMvxSimpleFileStoreService>();
            fileService.DeleteFile(fileName);
        }
        catch
        {
        }
    }

    public string Save(Stream stream)
    {
        try
        {
            var fileName = Guid.NewGuid().ToString();
            var fileService = this.GetService<IMvxSimpleFileStoreService>();
            fileName = Path.Combine("Image", fileName);
            fileService.WriteFile(fileName, stream.CopyTo);
            return fileName;
        }
        catch (ThreadAbortException)
        {
            throw;
        }
        catch (Exception exception)
        {
            return "";
        }
    }
}

Windows Phone 上显示图像的视图是

<Views:BaseCamView
x:Class="UI.WP7.Views.InstallMeter.CamView"
xmlns:Views="clr-namespace:UI.WP7.Views.InstallMeter"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:nativeConverters="clr-namespace:UI.WP7.NativeConverters"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True">

<Views:BaseCamView.Resources>
    <nativeConverters:PathToImageConverter x:Name="PathToImageConverter" />
</Views:BaseCamView.Resources>

<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel Grid.Row="0" Margin="12,17,0,28">
        <TextBlock Text="MY sdf" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock Text="{Binding ImagePath}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <Image Grid.Row="1" Source="{Binding ImagePath, Converter={StaticResource PathToImageConverter}}"  Height="200" Width="700" Stretch="Uniform" />

</Grid>

这个视图使用转换器将路径转换为位图图像

public class PathToImageConverter : IValueConverter, IMvxServiceConsumer<IMvxSimpleFileStoreService>
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        byte[] contents = null;
        try
        {
            var file = this.GetService();
            file.TryReadBinaryFile((string)value, out contents);
        }
        catch (Exception)
        {
            // masked
        }

        if (contents == null)
            return null;

        using (var stream = new MemoryStream(contents))
        {
            var image = new BitmapImage();
            image.SetSource(stream);
            return image;
        }
    }

但是当我尝试拍照时,转换器中的这一点会返回 null

if (contents == null)
        return null;

所以我认为这意味着图像无法访问/保存或文件名错误,但不确定错误发生在哪里


我认为您需要单步执行并调试照片代码。

您还可以尝试向异常捕获处理程序添加一些跟踪。

一种猜测是您的基于 GUID 的文件名包含无效字符 - 请参阅http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars%28v=vs.95%29.aspx http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars%28v=vs.95%29.aspx Try Guid.ToString("N") + ".jpg"一个稍微不那么混乱的文件名

但实际上您需要跟踪代码并找出错误发生的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 WP 上使用 MvvmCross 拍摄图像并显示图像时出现问题 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 如何注释 Django JSONField (对象数组)数据的总和?

    我有这样的模型 models py class MyModel models Model orders models JsonField null True blank True default list category models F
  • 通过 IClipboardDataPasteEventImpl 发生内存泄漏

    我注意到我的一项活动中的记忆力出现了奇怪的增长 因此我进行了一些测试 我多次打开对话框 打开 关闭 打开 关闭 并且内存不断增加 所以我使用 DDMS 转储 HPROF 文件并在MAT http www eclipse org mat 内存
  • 要使用的 Hibernate 或 JPA 注释

    我在我们的项目中使用 Hibernate 并为 Hibernate 域 Pojo 对象使用基于注释的配置 对于基于注释的配置 我们有两个选项 基于 JPA 的注释使用javax persistence 使用 Hibernate 本机注释or
  • 在javascript中通过给定的电话号码检测国家/地区代码[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含所有可用国家 地区代码的对象 我想知道如何通过给定的电话号码获取国家 地区代码并显示相应的国家 地区名称 电话号码将类似于 1
  • 我需要一个用于 Win/Linux 的二进制比较工具 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 首先 我不需要文本比较 因此 Beyond Compare 不能满足我的需要 我正在寻找一个可以在字节级别报告两个文件之间差异的实用程序
  • 我可以在没有公共 IP 的情况下为 Azure 虚拟机提供 Internet 访问权限吗?

    我在azure上有3个debian VM 其中一个有一个可以上网的公共IP VM 1 其他只有内部网络 VM 2 VM 3 我可以通过 VM 1 授予对 VM 2 或 VM 3 的访问权限吗 让我崩溃的是看到 VM 1 有 2 个网络接口
  • 制作 Laravel 集合的副本

    我正在尝试提供一份集合的副本users到一个雄辩的模型jobs 所以我实际上有 jobs 1 users 1 2 3 2 users 1 2 3 一旦我得到这个 我将对另一个查询中的一些数字进行求和 本质上为每个作业的每个用户提供一个总数
  • 使用 SQL 查询在 DB2 中插入 BLOB 数据

    我遇到了这样的情况 我需要通过从 DB2 Windows 7 上的 DB2 Express C 中的文件系统读取文件来将数据插入到 blob 列中 我在互联网上的某个地方找到了这个INSERT INTO VALUES readfile fi
  • Windows 身份验证混合

    我正在对 Intranet MVC 应用程序使用 Windows 身份验证 我想在身份验证过程中添加额外的逻辑 换句话说 用户除了存在于 AD 中之外 还必须存在于自定义数据库中才能进行身份验证 他们还应该注销 MVC 应用程序 然后使用相
  • RegexBuddy 的免费替代品 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何好的替代方案支持以不同风格编写正则表达式并允许您测试它们 以下是线程中提到的正则表达式工具的
  • 当使用 grunt 构建项目时,Fontawesome 无法工作

    我正在使用很棒的字体库字体 当项目不是用 grunt 构建 丑化时它可以工作 但是当我用 grunt 构建项目时 它不起作用 我在控制台中收到此错误 fonts fontawesome webfont woff v 4 0 3 404 未找
  • Visual Studio 2013团队项目已被删除

    在 vs 2013 中向源代码管理添加新的 Web 解决方案并首次签入后 我收到此错误 TF402484 The PROJECTNAME team project has been deleted Undo any pending chan
  • 将 JAX-WS 2.2.5 客户端与 JDK/JRE 1.5 结合使用

    Java 6 附带 JAX WS 2 0 据我所知 Java 5 并未附带 JAX WS 我能够将 JAX WS 2 2 5 与 Java 1 6 结合使用 通过使用Java认可的覆盖机制 https docs oracle com jav
  • PHP 生成的不完整时区列表

    我尝试生成中指定的完整时区集http php net manual en timezones php http php net manual en timezones php UTC 除外 使用以下代码 zones timezone ide
  • 如何在 Windows 上设置 Eclipse + StatET + Rcpp

    当我知道我可以使用 Rcpp 用 C 创建 R 包时 我感到很兴奋 并渴望了解它的开发环境 并感谢秋季统计博客 http blog fellstat com p 170 我可以使用 Eclipse 和 StatET 它的 R 插件 快速建立
  • 如何将 v-for 的值绑定到 v-if

    我正在使用 BootstrapVue 对于我的问题 我有一个v for在我的模板中有两个buttons 循环我的v for my v if不生成唯一的IDs单击一个按钮后 每个按钮都会被触发 from Open me to Close me
  • Heroku Godaddy 裸域 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个 Heroku 应用程序 并且添加了 CNAME www 到 herokuapp 以将其从 GoDaddy 重定向到 Heroku
  • 嵌套 VB (VBA) 枚举

    好吧 伙计们 我想实现嵌套枚举的效果 以便轻松对一些常量字符串进行分组 类似于下面的伪代码 Enum gKS Colby Hello Hays World end Enum Enum gMA Dodge Seven Muscatine Po
  • jQuery,未捕获的类型错误

    我的网页上有一些 javascript 代码 正在将一些 div 加载到页面上 我还想向每个 div 添加 onmouseenter 和 onmouseleave 事件处理程序 我正在使用 jquery 添加这些处理程序 但出现错误 对象
  • 在 WP 上使用 MvvmCross 拍摄图像并显示图像时出现问题

    我想用相机拍照并将其显示在我所在的页面上 所以我有一个 ViewModel 我可以在其中拍照并显示它 public class CamViewModel MvxViewModel IMvxServiceConsumer