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

时间:2012-08-09 10:02:25

标签: c# wpf

经过一些搜索,将运行时的图像加载到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: 我的回答是“解决”了,但是在Stack Overflow之外有一些帮助。这段代码工作正常:

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

2 个答案:

答案 0 :(得分:34)

在WPF中,图片通常是从StreamUri加载的。

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并且在此XAML中也有Image控件

<Image Name="image1" />

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

image1.Source = bitmap;

答案 1 :(得分:3)

确保您的sas.png在其Visual Studio 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;

和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将在运行时自动加载。