2016-09-07 2 views
-4

의 스레드 C# 작업 밖에있는 WPF 데이터는 어떻게 편집해야합니까? 표준 WPF 템플릿을 사용하여 UI를 정의했습니다. 그리드는 포함UI 업데이트 코드

내 코드에서
<TextBlock x:Name="myTextBox" Text="Original Text" /> 

내가 가진 : 다른 스레드가 그것을 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다

:

using System.Threading.Tasks; 
using System.Windows; 

namespace UpdateGUI 
{ 
    public partial class MainWindow : Window 
    { 
    private int myInt; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     myInt = 0; 
     Task.Factory.StartNew(() => 
     { 
     myInt++; 
     myTextBox.Text = "New Text"; 
     }); 
    } 
    } 
} 

이것은 다음과 같은 예외가 발생합니다 .

어떤 스레드가 myTextBox를 소유합니까? myInt를 편집 할 때 왜이 오류 메시지가 표시되지 않습니까?

+0

UI 스레드 만 UI 요소를 업데이트해야합니다. 다른 스레드가 UI를 업데이트해야하는 경우 UI 스레드에 요청해야합니다. 이를 수행하는 한 가지 방법은 [Dispatcher 클래스] (https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke (v = vs.110) .aspx)를 사용하는 것입니다. –

+1

또는 양방향 바인딩 메커니즘을 사용할 수 있습니다. 텍스트 상자를 모델의 속성에 바인딩하면 모델을 업데이트 할 수 있습니다. 그러면 모델이 자동으로 업데이트됩니다. – rmcsharry

+0

샘플 코드의 문제점은 너무 단순하여 다른 스레드를 시작할 필요가 없다는 것입니다. 스레드를 생성하는 이유를 설명하는보다 구체적인 필요성이있는 경우 더 구체적으로 안내 할 수 있습니다. – sstan

답변

0

당신이하려는 것은 불가능합니다. 코드는 UI 스레드와 별도의 자체 스레드에서 실행됩니다.

WPF에 대해 자세히 알아야합니다. 내가 알고있는이 개 솔루션가이 작업을 얻으려면 :

  • 는 디스패처
  • 옵션 1은이 작업을 수행하는 일반적인 방법을 구현

    1. 사용 모델 속성에 바인딩 양방향, 양방향 바인딩에 대해 배우십시오. 운영자는 당신이하려는 일에 과잉 공격을합니다.