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

3D-*_*tiv 15 c# wpf

经过一些搜索,将运行时的图像加载到WPF窗口似乎相当复杂!

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

我正在尝试使用此代码,但我需要一些帮助才能使其正常工作.我在代码下面有一些红线!我也想知道是否需要在XAML代码中添加一些额外的代码,或者是否足够了:

<Image Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" Name="image1" 
       Stretch="Fill" VerticalAlignment="Top" Width="350" />
Run Code Online (Sandbox Code Playgroud)

不知道,因为我看过XAML标签内部图像的示例.

编辑:

我知道这个:

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

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>
Run Code Online (Sandbox Code Playgroud)

编辑2:我的答案是"解决",但在Stack Overflow之外的som帮助.这段代码工作正常:

BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri("pack://application:,,,/Resources/" + company + ".png");
image.EndInit();
image2.Source = image;
Run Code Online (Sandbox Code Playgroud)

Cle*_*ens 38

在WPF中,图像通常从StreamUri加载.

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

var uri = new Uri("http://...");
var bitmap = new BitmapImage(uri);
Run Code Online (Sandbox Code Playgroud)

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

var path = Path.Combine(Environment.CurrentDirectory, "Bilder", "sas.png");
var uri = new Uri(path);
Run Code Online (Sandbox Code Playgroud)

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

var uri = new Uri("pack://application:,,,/Bilder/sas.png");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Visual Studio Build Action sas.png必须是Resource.

一旦你创建了BitmapImage一个像这个XAML一样的图像控件

<Image Name="image1" />
Run Code Online (Sandbox Code Playgroud)

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

image1.Source = bitmap;
Run Code Online (Sandbox Code Playgroud)

  • 不需要BeginInit和EndInit.只需使用`BitmapImage(Uri)`构造函数.否则该代码*与我在这里回答的内容没有任何不同*,除了该文件夹被称为"Resources",而不是"Bilder". (3认同)

WPF*_*-it 7

确保您的Visual Studio 中sas.png被标记为Build Action: Content和...Copy To Output Directory: Copy AlwaysProperties

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

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

并且 XAML 应该是

<Image Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" 
       Name="image1" Stretch="Fill" VerticalAlignment="Top" 
       Source="../Bilder/sas.png"
       Width="350" />  
Run Code Online (Sandbox Code Playgroud)

编辑

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

<Image Source="{Binding Converter={StaticResource MyImageSourceConverter}}"
       x:Name="MyImage"/>
Run Code Online (Sandbox Code Playgroud)

image.DataContext路径在哪里string

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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