2015-01-26 3 views
-1

파일이 변경되면 내 wpf에서 이미지를 업데이트하고 싶습니다. 내 문제는 Image.Source를 편집 할 수 없기 때문에 Image 객체가 다른 스레드에 속한다는 오류가 발생한다는 것입니다. 파일 워처 이벤트가 발생할 때 이미지가 변경되기를 원합니다. 어떻게해야합니까?WPF FileWatcher 업데이트 Image.Source 스레드 충돌

나는 이런 식으로 뭔가가 :

C# 클래스 1 :

void fileWatcher_Changed(object sender, FileSystemEventArgs e) 
{ 
    uiClass.UpdateImage(new BufferedImage(Path)) 
} 

.xaml WPF uiClass :

Image x:Name="Image" 

.cs WPF uiClass :

public void UpdateImage(BufferedImage img) 
{ 
    this.Image.Source = img; 
} 

댓글 : fileSystemWatcher가 작동합니다. 의도 한대로.

+1

Dispatcher.BeginInvoke()? – aloisdg

답변

0

귀하의 FileWatcher 이벤트 (fileWatcher_Changed가)는 (UpdateImage에 대한 호출을 통해) 이미지의 Source 속성을 업데이트하려고있는 백그라운드 스레드에 발생합니다. Image 컨트롤 (간단히 말해서)은 UI 스레드에서만 업데이트 할 수 있기 때문에 오류로 인해 실패합니다.

public void UpdateImage(BufferedImage img) 
{ 
    Action updateImage =() => { this.Image.Source = img }; 
    Dispatcher.BeginInvoke(updateImage); 
} 

다른 방법은 속성을 가지고하는 것입니다 (: @aloisdg는 의견 상태로

, 당신은 UI 스레드에 백그라운드 스레드에서 작업을 이동하는 디스패처의 BeginInvoke 방법을 사용할 수 있습니다 이미지 소스를 나타내는 Window 또는 ViewModel 등)에 저장하고 XAML에서 해당 속성에 바인딩합니다. 그런 다음 백그라운드 스레드 또는 UI 스레드에서 해당 속성을 변경하는지 여부는 중요하지 않습니다.

BufferedImage 클래스의 소스 코드를 게시하는 것이 좋습니다. 현재 BufferedImage의 인스턴스를 Image.Source 속성에 할당하려고합니다. 스레드 문제가 해결 되더라도 예상대로 작동하지 않을 것으로 판단됩니다.

+0

완벽하게 일했습니다! 명확하고 진지한 답변을 보내 주셔서 감사합니다. : D 당신은 나에게 많은 시간을 구했고 당신의 대답은 이해하기 쉽습니다! :디 – Sebbe