Есть <Image x:Name="Zoomage" Height="100" Width="150" RenderTransformOrigin="0.5,0.5">, в котором долна в реалином времени отображаться картинка. Мы получаем ее в цикле и выводим с помощью:
form.Dispatcher.Invoke(new Action(() => {
form.Zoomage.Source = ImageSourceForBitmap(image);
}));
Однако изображение просто не обновляется. Возможно нужно делать это через Binding с использованием INotifyPropertyChanged, но я не могу понять, как это сделать.
А функция ImageSourceForBitmap у вас правильно работает? Может там происходит неверное создание BitmapImage и он просто оказывается пустой?
А по поводу Binding скажу следующее: не обязательно связывать data и view через Binding. Это всего лишь один из способов. Чтобы решить вашу задачу через Binding необходимо сделать следующее:
Реализуем интефейс INotifyPropertyChanged.
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName]string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
Создаём проперти Bitmap к которому будем делать привязку.
private BitmapImage image;
public BitmapImage Image
{
get
{
return image;
}
private set
{
image = value;
OnPropertyChanged("Image");
}
}
OnPropertyChanged("Image") - уведомляет view о изменении проперти с имеем "Image". После этого view "забиндинное" на это проперти запросит метод get у него и получит новые данные.
В конструкторе страницы укажите DataContext.
this.DataContext = this;
В данном случае this, потому что данные которые "биндятся" находятся в этом же классе. По хорошему надо применять MVVM.
Изменяем XAML для использования Binding.
Image x:Name="ImageElement" Source="{Binding Image}" HorizontalAlignment="Center" VerticalAlignment="Center" Height="100" Width="100"
Вот и готов Binding. Теперь, изменив проперти Image в коде, у вас автоматически изменится ImageElement. Ниже привожу код класса для полноты картины:
public partial class MainWindow : Window, INotifyPropertyChanged
{
private BitmapImage image;
public BitmapImage Image
{
get
{
return image;
}
private set
{
image = value;
OnPropertyChanged("Image");
}
}
public MainWindow()
{
InitializeComponent();
this.Loaded += MainWindow_Loaded;
//Указывает контекст данные для страницы.
this.DataContext = this;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
StartShowImages();
}
/// <summary>
/// Изменяю Image. Картинки 1.png, 2.png, 3.png лежат в корне проекта.
/// </summary>
public async void StartShowImages()
{
int i = 1;
while(true)
{
await Task.Delay(1000);
Image = new BitmapImage(new Uri($@"{i}.png", UriKind.Relative));
//ImageElement.Source = new BitmapImage(new Uri($@"{i}.png", UriKind.Relative));
i++;
if(i > 3)
{
i = 1;
}
}
}
#region Реализация INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName]string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
#endregion
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости