【问题标题】:Display and saving images with WPF使用 WPF 显示和保存图像
【发布时间】:2015-04-15 23:48:51
【问题描述】:

我决定将我的 WinForm 项目移植到 WPF,但遇到了一个问题: 我的软件有一个用户空间。通常,通过 OpenFileDialog 选择图像,该图像由控件“Image”(代码中的roundPB)存储和使用。但是,我的 WinForm 代码在 WPF 中不起作用,因为“图像”的 PictureBox 的属性不同。 这是我当前的非功能代码:

Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    Dim OpenFileDialog2 As New Microsoft.Win32.OpenFileDialog()
    Dim ImagePath As String = Nothing
    If OpenFileDialog2.ShowDialog() = vbOK Then
        ImagePath = OpenFileDialog2.FileName
        My.Computer.FileSystem.CopyFile(ImagePath, ImageRep & System.Environment.GetEnvironmentVariable("ProgramFiles") & "\MTS\profpic.png", overwrite:=True)
    Else : Exit Sub : End If
    If roundPB IsNot Nothing Then roundPB.Source.Freeze()
    roundPB.Source = New BitmapImage(New Uri(ImagePath, UriKind.Relative))
End Sub
Private Sub MetroWindow_Loaded(sender As Object, e As RoutedEventArgs)
    If My.Computer.FileSystem.FileExists(System.Environment.GetEnvironmentVariable("ProgramFiles") & "\MTS\profpic.png") Then
        Dim ImagePath As String = System.Environment.GetEnvironmentVariable("ProgramFiles") & "\MTS\profpic.png"
        roundPB.Source = New BitmapImage(New Uri(ImagePath, UriKind.Relative))
        roundPB.Source.Freeze()
    End If
End Sub

绝对没有任何效果,roundPB(没有显示图片)和保存都没有,但没有返回错误消息。 你能启发我吗? 谢谢!

【问题讨论】:

  • 没有Handles 子句。你确定这些事件正在触发吗?
  • Else : Exit Sub : End If 这种格式是反人类罪。
  • 是的,当我单击按钮时,会显示 openfiledialog,但当我选择图片时没有任何反应。 (对不起我的罪行,我不会杀人:p)

标签: .net wpf vb.net winforms


【解决方案1】:

表达式

System.Environment.GetEnvironmentVariable("ProgramFiles") & "\MTS\profpic.png"

应该给你一个绝对路径,例如C:\Program Files\MTS\profpic.png,那你为什么要尝试创建一个相对的 Uri?

根本不要设置UriKind

roundPB.Source = New BitmapImage(New Uri(ImagePath))

为了保存文件,你希望下面这行的结果是什么?

ImageRep & System.Environment.GetEnvironmentVariable("ProgramFiles") & "\MTS\profpic.png", 

您可能应该删除 ImageRep 前缀。

【讨论】:

  • 谢谢,我删除了 UriKind,现在图像在启动时加载良好但保存不起作用,没有任何反应:文件没有改变,图片也没有改变form :/ ImageRep 是我在 WinForm 上的代码的残留代码,它已经在我的项目中被删除了 :)
  • WPF 可能会保持图像文件处于打开状态(这样它就不会被覆盖),并且它还会以文件名作为键来缓存图像。因此,编写具有相同名称的文件不会导致 UI 中的图像更新。您可以使用不同的文件名或从 FileStream 加载 BitmapImage,例如显示在this answer
  • 你有 vb.NET 的例子吗?我无法阅读 C#:/ 谢谢
  • 不,我没有。但是 MSDN 上的在线文档中有 VB 示例。无论如何,学习 C# 可能是值得的。
  • 非常感谢克莱门斯,它成功了!我将在下面发布代码:)
【解决方案2】:

我像 Clemens 所说的那样使用 BitmapImage 解决了我的问题。这是我的功能代码:

    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    Dim OpenFileDialog2 As New Microsoft.Win32.OpenFileDialog()
    Dim ImagePath As String = Nothing
    Dim bitmapimage As New BitmapImage
    If OpenFileDialog2.ShowDialog() = True Then
        ImagePath = OpenFileDialog2.FileName
        bitmapimage.BeginInit()
        bitmapimage.CacheOption = BitmapCacheOption.OnLoad
        bitmapimage.UriSource = New Uri(ImagePath)
        bitmapimage.EndInit()
        My.Computer.FileSystem.CopyFile(ImagePath, My.Computer.FileSystem.SpecialDirectories.ProgramFiles & "\MTS\profpic.png", overwrite:=True)
        roundPB.Source = bitmapimage
    Else
    End If
End Sub
Private Sub MetroWindow_Loaded(sender As Object, e As RoutedEventArgs)
    If My.Computer.FileSystem.FileExists(System.Environment.GetEnvironmentVariable("ProgramFiles") & "\MTS\profpic.png") Then
        Dim ImagePath As String = My.Computer.FileSystem.SpecialDirectories.ProgramFiles & "\MTS\profpic.png"
        Dim bitmapimage As New BitmapImage
        bitmapimage.BeginInit()
        bitmapimage.CacheOption = BitmapCacheOption.OnLoad
        bitmapimage.UriSource = New Uri(ImagePath)
        bitmapimage.EndInit()
        roundPB.Source = bitmapimage
    End If
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2020-09-10
    • 2016-07-27
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多