Обновление элемента управления WPF в режиме реального времени - PullRequest
0 голосов
/ 03 августа 2010

Я пишу приложение, которое будет отображать текущее изображение, видимое камерой, и оно должно обновить отображаемое изображение в режиме реального времени или близко к нему. По сути, у меня есть камера, с помощью которой я могу снимать изображения, и мне нужно снимать одну каждую, скажем, 1 секунду и отображать это изображение на экране. В настоящее время мое приложение имеет элемент управления изображением, и я собираю BitmapImage с камеры и устанавливаю его как Image.Source. Моя проблема в том, чтобы постоянно обновлять это. К сожалению, у меня нет опыта работы с чем-то подобным, которое должно обновляться само по себе (или до тех пор, пока приложение, которое я пишу, не будет закрыто), и, честно говоря, кажется, что очень мало или ничего (что я смог найти) Веб о том, как сделать что-то подобное в WPF / C #. Я подозреваю, что мне придется создавать поток, чтобы выполнить захват изображения, но, честно говоря, это часть моей проблемы - у меня очень мало опыта работы с потоками, и я немного запутался в том, как все это работает. Большое спасибо за любую помощь, которую вы можете предоставить.

Ответы [ 3 ]

3 голосов
/ 04 августа 2010

Для правильного обновления привязки данных вы можете использовать INotifyPropertyChanged . Просто добавьте ссылку на System.ComponentModel:

using System.ComponentModel;

Затем наследуйте интерфейс:

MyWindow : INotifyPropertyChanged

Затем добавьте следующий код:

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}

Наконец, добавьте вашу собственность, к которой вы хотите привязать.

private BitmapImage currentImage;
public BitmapImage CurrentImage{get{return currentImage;} set{currentImage=value;NotifyPropertyChanged("CurrentImage");}}

Наконец, в вашем xaml измените привязку на {Binding CurrentImage}, а затем для окна установите для контекста данных относительный источник self ... это будет свойство для окна:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

Это должно привести к правильной работе привязки. Для выполнения операций в отдельном потоке потребуется диспетчер

0 голосов
/ 17 августа 2010

Я нахожусь в аналогичной ситуации, за исключением того, что изображение передается моему клиенту WPF через WCF. Поэтому я установил таймер и вызываю службу WCf каждую 1 секунду. Но когда я назначаю ImageSource для bitmapImage, изображение мерцает, как при получении белого экрана, изображения, экрана, изображения Как сделать это непрерывным?

0 голосов
/ 03 августа 2010

Вы должны прочитать о привязке данных в WPF.WPF изобилует шаблонами наблюдателей для обновления отображения, как только связанный элемент данных изменяется.Тот факт, что вы меняете Image.Source вместо того, чтобы изменять содержимое изображения, может вызывать недоумение.Вам необходимо настроить элемент управления изображением в XAML как привязанный к данным к растровому объекту (возможно, к полю вашей формы), а затем изменить или перезагрузить растровый объект по мере необходимости.Элемент управления изображения с привязкой к данным должен автоматически перерисовываться при каждом изменении объекта растрового изображения.

Поскольку вы упоминаете фоновые потоки, вам нужно быть осторожным, чтобы изменять свойства элементов пользовательского интерфейса (Изображение, Растровое изображение) толькоПользовательский интерфейсЕсли вы получаете новое изображение в фоновом потоке и хотите показать его в пользовательском интерфейсе, вам нужно будет синхронизировать это обновление с потоком пользовательского интерфейса.См. Диспетчер .Invoke ()

...