2010-05-07 3 views
2

내 현재의 평판이 "1337"이기 때문에 현재 활동을 연기하고 있습니다. :)일반 질문 WPF 컨트롤 동작 및 호출 사용

이것은 "이유"가 아니라 "방법"의 질문입니다. 기본적으로 WPF는 창을 열 때 첫 번째 컨트롤에 포커스를 설정하지 않는 것 같습니다. 또한 텍스트 상자에 포커스가있을 때 기본적으로 텍스트 상자에는 선택된 텍스트가 없습니다. 그래서 기본적으로 창을 열면 윈도우의 첫 번째 컨트롤에 포커스를두고 컨트롤이 텍스트 상자이면 기존 텍스트 (있는 경우)를 선택해야합니다.

이러한 동작을 수행하기 위해 온라인에서 몇 가지 팁을 찾아서 결합했습니다. 내 창문의 생성자에 배치 한 아래 코드는 내가 작성한 코드입니다.

Loaded += (sender, e) => 
      { 
       MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
       var textBox = FocusManager.GetFocusedElement(this) as TextBox; 
       if (textBox != null) 
       { 
        Action select = textBox.SelectAll; 
        //for some reason this doesn't work without using invoke. 
        Dispatcher.Invoke(DispatcherPriority.Loaded, select); 
       } 
      }; 

그래서 내 질문에. Dispatcher.Invoke를 사용하지 않고 위의 코드가 작동하지 않는 이유는 무엇입니까? 창 (또는 텍스트 상자)의 동작에 내장 된 것이 선택된 텍스트가로드 후 선택 취소됩니다?

어쩌면 관련, 아마 - 나는 형태의 동작을 제어 할 수 Dispatcher.Invoke를 사용했던 곳의 또 다른 예 :

WPF Focus In Tab Control Content When New Tab is Created

+0

죄송합니다. 귀하의 1337을 망칠 필요가 있었지만 큰 질문이었습니다. –

답변

1

모든 WPF 컨트롤 스레드 선호도가 있습니다. Dispatcher은 각 컨트롤이 만들어진 스레드를 관리합니다. 일반적으로 응용 프로그램의 모든 컨트롤에 대해 단일 스레드이지만 반드시 그런 것은 아닙니다. 작업은이 스레드에서 대기하고 우선 순위에 따라 실행됩니다.

모든 UI 조작 코드는 컨트롤이 만들어진 스레드와 동일한 스레드에서 실행되어야합니다. 즉, Dispatcher 스레드이므로 UI에 영향을 줄 수있는 모든 작업을 수행하기 전에 모든 스레드에서 해당 스레드를 호출해야합니다. TextBox에서 텍스트 선택과 같은).

즉, Loaded 이벤트 핸들러는 기본적으로 Dispatcher 스레드에서 실행되므로, 특정 예제에서이 동작이 나타나는 이유를 완전히 알 수는 없습니다.

1

내가 그 작업 w/dispatcher 호출 (프레임 워크 업데이트에서 수정되었을 수 있습니다) - 밖으로, 그 작업을 만드는 아무런 문제가 언급해야합니다 - 그러나 이전 포스터 언급 한 정확하고되었습니다 winforms (.DoAction() 및 .Invoke())의 새벽부터 pardigm. 그러나 3.5에서 위의 당신이 당신의 람다의 대상 통화로 코드 숨김에서 정의 된 방법을 사용하는 경우 인/아웃 디스패처 승 작업을했다 :에 관해서는

Loaded += (sender, e) => 
    { 
    this.SelectText(); 
    }; 

    void SelectText() 
    { 
    MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
    var textBox = FocusManager.GetFocusedElement(this) as TextBox; 

    if (textBox != null) 
    { 
    textBox.SelectAll(); 
    } 
    } 

를, 난 정말 당신에게 세부 사항을 제공하지 못할 그러나 나는 '왜 발표자에게 이벤트를 전달하기 위해 람다 (lambda)를 사용하여 비슷한 문제가 발생했습니다. 컴파일 된 표현식의 참조 또는 컨텍스트와 관련하여 무언가를 말하고 싶습니다.이 경우에는 조작을 위임하는 방법 (오른쪽 스레드에서 텍스트 상자 텍스트 선택)을 알기 위해 포함하는 객체에 대한 참조가 필요합니다. 나는 또한 GC가 때때로 자원을 정리할 수 있기 때문에 지연된 실행에 문제가 생길 수 있다고 생각한다. (F #에서 볼 수 있듯이 C#의 문제점이기도하다.)