2017-11-10 9 views
4

PowerShell의 runspaces를 사용하여 작은 GUI 응용 프로그램의 성능을 향상시키고 있습니다.Powershell의 다른 실행 공간에서 실행중인 WPF 양식 요소의 메서드를 호출하는 방법

나는 지금까지 두 가지 목적을 가진 runspace를 가지고있다. 첫째, 모든 다른 runspaces를 보유하고 있으며, 두 번째로 GUI GUI 파일을 파싱하고 표시한다. 또한 노드를 sychronized 해시 테이블에 추가하므로 모든 실행 영역에서 액세스 할 수 있습니다. 상상할 수 있듯이이 GUI에는 클릭 할 때 동작을 트리거하는 버튼이 있습니다. 꽤 간단한 물건과 실제로 그것은 지금까지 일하고있다. 나는 runspace간에 데이터를 교환 할 수 있으며 특정 버튼을 클릭 할 때 GUI를 업데이트 할 수도 있습니다.

그러나 xml 파일의 빈 스택 판에서 addChild() 메소드를 호출 할 수 없습니다. 기본적으로 스택 패널 (CheckboxViewer)에 체크 박스를 추가하기 만하면됩니다.

$checkbox = New-Object System.Windows.Controls.CheckBox 
$checkbox.Content = "Hello world" 
$syncHash.checkbox = $checkbox 
$syncHash.CheckboxViewer.Dispatcher.Invoke(
    [Action]{ 
     #this is working: 
     $syncHash.CheckboxViewer.Background = 'Black' 
     #this is not working 
     $syncHash.CheckboxViewer.AddChild($syncHash.checkbox) 
    }, "Normal") 

I 나타나는 오류 메시지 (발송자를 사용하지 않고) 직접 다른 실행 영역에 액세스하려고 할 때 하나를 얻는 일반적인 오류 메시지입니다 :

예외 ("1"인수와 함께 "하는 AddChild"를 호출 들) : 다른 스레드가 그것을 소유하고 있기 때문에 "호출하는 스레드가이 개체에 액세스 할 수 없습니다

어떤 아이디어를 내가 잘못 여기서 뭐하는 거지 도움의 모든 종류가 많이 주시면 감사하겠습니다, 감사

.?!
+0

내부를 선언해야합니까? 작동한다면 대답으로 추가 할 것입니다. – Manu

+0

당신은 직접 $ checkbox.Background를 사용할 수 있습니다. –

+0

@Manu - 불행히도 저에게 같은 오류 메시지를줍니다 ... – Quhalix89

답변

1

이 함께보십시오 :

$syncHash.Window.Dispatcher.Invoke([action]{ 
    $checkbox = New-Object System.Windows.Controls.CheckBox 
    $checkbox.Content = "Hello world" 
    $syncHash.CheckboxViewer.AddChild($checkbox) 
}, "Normal") 

이 컨트롤을 추가하려면, 당신은`$ syncHash.CheckboxViewer.Children.Add ($ syncHash.checkbox)`으로 시도 할 수 [action]

+0

예하, 감사합니다. @Manu - 그건 마치 매력처럼 작동합니다 :-) – Quhalix89