Как загрузить изображение в 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.
EDIT:
Я знаю это:
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:
Мой ответ "разрешен", но с помощью som help вне Stack Overflow. Этот код отлично работает:
BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri("pack://application:,,,/Resources/" + company + ".png");
image.EndInit();
image2.Source = image;
Ответы
Ответ 1
В WPF изображение обычно загружается из потока или 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");
В этом случае Visual Build Build Action для sas.png
должно быть Resource
.
Как только вы создали BitmapImage
, а также Image, как в этом XAML
<Image Name="image1" />
вы просто назначили BitmapImage свойству Source
этого элемента управления Image:
image1.Source = bitmap;
Ответ 2
Убедитесь, что ваш sas.png
отмечен как Build Action: Content
и Copy To Output Directory: Copy Always
в своей Visual Studio Properties
...
Я думаю, что исходный код С# похож на этот...
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.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();
}
}
Теперь, когда вы устанавливаете другой контекст данных, Image
будет автоматически загружаться во время выполнения.