如何在运行时将图像加载到 WPF?

Posted

技术标签:

【中文标题】如何在运行时将图像加载到 WPF?【英文标题】:How to load image to WPF in runtime? 【发布时间】:2012-08-06 12:47:12 【问题描述】:

在运行时将图像加载到 WPF 窗口似乎相当复杂。

Image image;
image = new Uri("Bilder/sas.png", UriKind.Relative);
????.Source = new BitmapImage(image);

我正在尝试这段代码,但我需要一些帮助才能让它工作。我在代码下方看到了一些红线!我还想知道是否需要在 XAML 代码中添加一些额外的代码,或者是否足够:

<Image Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" Name="image1" 
       Stretch="Fill" VerticalAlignment="Top" Width="350" />

很奇怪,因为我已经看到了 XAML 标记内图像的示例。

编辑:

我现在正在使用这个:

var uri = new Uri("pack://application:,,,/sas.png");
var bitmap = new BitmapImage(uri);
image1.Source = bitmap;

XAML:

<Grid Width="374">
    <Image Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="350" />
    <Button Content="Start" Height="23" HorizontalAlignment="Left" Margin="12,226,0,0" Name="btnStart" VerticalAlignment="Top" Width="75" />
    <Button Content="Land" Height="23" HorizontalAlignment="Left" Margin="287,226,0,0" Name="btnLand" VerticalAlignment="Top" Width="75" />
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="110,226,0,0" Name="cmbChangeRoute" VerticalAlignment="Top" Width="156" />
</Grid>

编辑 2: 我的问题解决了,这段代码可以正常工作:

BitmapImage image = new BitmapImage(
    new Uri("pack://application:,,,/Resources/" + company + ".png"));
image2.Source = image;

【问题讨论】:

前两行代码不可能是对的; Uri 不是图像。 谢谢!但知道它抱怨路径!它正在寻找 C 的路径:什么时候应该是 bin/debug!? 【参考方案1】:

在 WPF 中,图像通常从 Stream 或 Uri 加载。

BitmapImage 支持两者,甚至可以将 Uri 作为构造函数参数传递:

var uri = new Uri("http://...");
var bitmap = new BitmapImage(uri);

如果图像文件位于本地文件夹中,则必须使用 file:// Uri。您可以从这样的路径创建这样的 Uri:

var path = Path.Combine(Environment.CurrentDirectory, "Bilder", "sas.png");
var uri = new Uri(path);

如果图像文件是程序集资源,则 Uri 必须遵循Pack Uri 方案:

var uri = new Uri("pack://application:,,,/Bilder/sas.png");

在这种情况下,sas.png 的 Visual Studio 构建操作必须是 Resource

一旦你创建了一个BitmapImage 并且还有一个Image 控件,就像在这个 XAML 中一样

<Image Name="image1" />

您只需将 BitmapImage 分配给该 Image 控件的 Source 属性:

image1.Source = bitmap;

【讨论】:

但是 XAML 中的代码呢?!像这样: 不,我错过了!好吧,既然我在 bin/debug 中有一个这样的文件夹,它应该可以工作吗?但是知道我正试图从资源中得到它的工作,并且会寻求一些帮助来让它工作吗?首先,我想我不需要在 XAML 代码中添加任何额外内容,因为图像已经有一个名称:image1 ?? bin/Debug 中的文件夹不够用。正如我所说,它必须在您的 VS 项目中。并且 XAML &lt;Image Name="image1" ... /&gt; 创建了一个名为 image1 类型为 Image 的成员变量,它是 WPF 控件,而不是位图/图像。 我正在使用你的代码,但我只收到一个关于 Uri 前缀无法识别的错误!? 不需要 BeginInit 和 EndInit。只需使用BitmapImage(Uri) 构造函数。否则,该代码绝不与我在这里回答的不同,除了文件夹名为Resources,而不是Bilder【参考方案2】:

确保您的 sas.png 在其 Visual Studio Properties 中标记为 Build Action: ContentCopy To Output Directory: Copy Always...

我认为 C# 源代码是这样的......

Image image = new Image();
image.Source = (new ImageSourceConverter()).ConvertFromString("pack://application:,,,/Bilder/sas.png") as ImageSource;

XAML 应该是

<Image Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" 
       Name="image1" Stretch="Fill" VerticalAlignment="Top" 
       Source="../Bilder/sas.png"
       Width="350" />  

编辑

我认为 XAML 会动态地提供加载图像的最佳方式 ...

<Image Source="Binding Converter=StaticResource MyImageSourceConverter"
       x:Name="MyImage"/>

其中image.DataContextstring 路径。

MyImage.DataContext = "pack://application:,,,/Bilder/sas.png";

public class MyImageSourceConverter : IValueConverter

    public object Convert(object value_, Type targetType_, 
    object parameter_, System.Globalization.CultureInfo culture_)
    
        return (new ImageSourceConverter()).ConvertFromString (value.ToString());
    

    public object ConvertBack(object value, Type targetType, 
    object parameter, CultureInfo culture)
    
          throw new NotImplementedException();
    

现在,当您设置不同的数据上下文时,Image 将在运行时自动加载。

【讨论】:

嗯,但是如果我想在运行时加载不同的图像。当我创建 WPF 窗口的对象时,我想传递不同的图像,那么我猜 XAML 代码看起来会有所不同?我已将所有图像保存在 Bin/Debug 内的一个文件中,好吗? 谢谢!但是他的方式不是很复杂,只使用一些图像吗!? :) 这就是我们在 WPF 中的做法...如果您不想要 XAML,请使用我最初提供的 C# 代码...image.Source = (new ImageSourceConverter()).ConvertFromString("pack://application:,,,/Bilder/sas.png" ) as ImageSource; 感谢您的帮助,但我正在使用另一个代码!请参阅我的第二次编辑。 认为你的意思是 value_.ToString()

以上是关于如何在运行时将图像加载到 WPF?的主要内容,如果未能解决你的问题,请参考以下文章

在运行时将新表重新加载/替换到 WPF DataGrid 中

在运行时将图像加载到对话框图片控件中

如何在运行时将代码加载到 Android 中

如何在运行时将 3D 内容加载到 RealityKit 应用程序中?

在运行时将实体对象添加到 LINQ-to-SQL 数据上下文 - SQL、C#(WPF)

如何在.NET 运行时将文件夹添加到程序集搜索路径?