2010-08-03 5 views
0

나는 카메라로 볼 수있는 현재 이미지를 보여줄 애플리케이션을 작성하고 있으며 실시간으로 또는 표시된 이미지를 업데이트해야합니다. 본질적으로, 나는 이미지를 캡처 할 수있는 카메라가 있으며, 1 초마다 1을 캡처하여 이미지를 화면에 표시해야합니다. 현재, 내 응용 프로그램에는 Image 컨트롤이 있으며, 카메라에서 BitmapImage를 캡처하고이를 Image.Source로 설정합니다. 문제가 계속해서 업데이트되고 있습니다. 불행히도, 나는 영원히 (또는 내가 쓰고있는 응용 프로그램이 닫힐 때까지) 스스로를 업데이트해야하는 이와 같은 것을 다루는 경험이 없으며, 솔직히 거기에 거의 아무것도 없을 것 같다 (나는 발굴 할 수 있었다). WPF/C#에서 이와 비슷한 일을하는 웹. 나는 이미지 캡처를 수행하기 위해 스레드를 생성해야한다고 생각하지만, 솔직히 그건 내 문제의 일부입니다. 스레드에 대한 작업 경험이 거의 없으며, 어떻게 작동하는지 조금 혼란 스럽습니다. 당신이 제공 할 수있는 도움을 주셔서 대단히 감사드립니다.WPF 컨트롤을 "실시간"으로 업데이트하기

답변

3

데이터 바인딩을 올바르게 업데이트하려면 INotifyPropertyChanged을 사용할 수 있습니다. 그냥 System.ComponentModel에 대한 참조를 추가 : 당신이 원하는 당신의 속성을 추가, 마지막으로

public event PropertyChangedEventHandler PropertyChanged; 

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

:

MyWindow : INotifyPropertyChanged 

그런 다음에 다음 코드를 추가합니다

using System.ComponentModel; 

그런 다음 인터페이스를 상속 에 묶다.

:

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

마지막으로, XAML에서 창을 위해 다음 {CurrentImage 바인딩}와 결합을 변경, 상대 소스 자체에 데이터 컨텍스트를 설정 ...이 윈도우의 속성이 될 것입니다

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

바인딩이 제대로 작동해야합니다. 별도의 스레드에서 작업을 수행하려면 디스패처가 필요합니다.

+0

이 답변을 아래의 dthorpe와 결합하면 완벽하게 작동합니다! 아주 명확하고 가짜 인 것을 만들어 줘서 고마워. 그것은 대단히 감사했습니다. – JToland

0

WPF에서 데이터 바인딩을 읽어야합니다. WPF는 바운더리 데이터 항목이 변경되는 즉시 디스플레이를 업데이트하기 위해 옵저버 패턴으로 가득 차 있습니다. 이미지 내용을 변경하는 대신 Image.Source를 변경한다는 사실은 혼란 스러울 수 있습니다. XAML에서 이미지 컨트롤을 비트 맵 개체 (아마도 양식의 필드)에 대한 데이터 바인딩으로 설정 한 다음 필요에 따라 비트 맵 개체를 변경하거나 다시로드해야합니다. 데이터 바인딩 된 이미지 컨트롤은 비트 맵 객체가 변경 될 때마다 자동으로 다시 그려야합니다.

배경 스레드를 언급 했으므로 UI ​​스레드에서만 UI 요소 (이미지, 비트 맵)의 속성을 수정해야합니다. 백그라운드 스레드에서 새 이미지를 받고이를 UI에 표시하려면 해당 업데이트를 UI 스레드와 동기화해야합니다. Dispatcher 참조 .Invoke()

+0

WPF와 마찬가지로 [Dispatcher] (http://msdn.microsoft.com/en-us/magazine/cc163328.aspx)를 사용하면 UI 스레드와 동기화하는 WPF 방식을 사용할 수 있습니다. –

+0

아마 나는 이것을 정확하게 이해하지 못한다 ... 이미지 컨트롤에 대한 Content 속성이 없기 때문에 Source를 폼의 Property에 바인딩했다.내가 시도 : 이미지 소스 = "{바인딩 경로 = CurrentImage}"이름 = "img_imageViewer"/> 그러나 내가 this.CurrentImage 나중에 프로그래밍 방식으로 설정할 때 이미지 컨트롤 그냥 빈 이미지를 얻으십시오. 내가 뭔가 잘못하고 있니? 또한 이미지를 매초 (또는 일부 기간) 업데이트하려면 백그라운드 스레드를 사용하여 CurrentImage 속성 또는 다른 형식을 변경하는 것이 좋습니다? 다시 한 번 감사드립니다! – JToland

+0

@JToland : 구현하는 속성에 바인딩하는 경우 해당 속성이 포함 된 클래스에서 INotifyPropertyChanged를 구현하여 데이터 바인딩 메커니즘에서 속성이 변경되었음을 알리고 그에 따라 적절하게 응답해야합니다. 예를 들어,이 클래스는 폼 클래스입니다. MSDN의 예제 구현을 참조하십시오. http://msdn.microsoft.com/en-us/library/ms229614.aspx – dthorpe

0

Image가 WCF를 통해 내 WPF 클라이언트에 전달된다는 점을 제외하면 비슷한 상황입니다. 그래서 저는 타이머를 설정하고 매 1 초마다 WCf 서비스를 호출합니다. 그러나 ImageSource를 bitmapImage에 할당하면 이미지가 깜박이며 흰색 화면, 이미지, 부엉 화면, 이미지가 나타납니다. 어떻게 연속적으로 만들 수 있습니까?

+0

위에서 설명한 방법을 사용해 보셨습니까? 내 CurrentImage 속성이 변경되었을 때, 그리고 위에서 설명한대로 알리미를 사용할 때 내 이미지가 일종의 깜박임없이 제대로 변경됩니다. 아마도 '새'이미지가 실제로 설정되기 전에 '현재'이미지가 속성이나 메모리 등에서 지워지고있는 것입니까? – JToland

+0

아니, 나는 아직해야할 일이 무엇인지 완전히 이해하지 못하기 때문에 아직 시도하지 않았다. Image 요소가있는 창을 INotifyPropertyChanged에서 상속 받도록 변경합니까? MainWIndow : Window가 으로 변경됩니다. MainWindow : INotifyPropertyChanged ?? 그런 다음 창에있는 다른 요소는 어떻습니까? – xaria