2009-10-23 2 views
1

RichEditBox를 기반으로하는 텍스트 편집기에서 작업하고 있습니다. 최종적으로 해결할 기능인 "Go to line"을 구현했습니다. TextPointer.Paragraph.BringIntoView();Paragraph.BringIntoView()는 포커스가있는 경우에만 작동합니다.

이 외에도 캐럿 위치도 설정합니다. 내가 알기로는 BringIntoView이 먼저 RichEditBox을 클릭하면 작동합니다 (집중). 그렇지 않으면 무시당하는 것 같습니다. BringIntoView 주변 코드에 의해 캐럿 위치가 조정되었음을 알 수 있습니다.

아무도 그 문제의 이유/본질을 알고 있습니까? 어떻게 그것을 극복 할 수 있습니까?

+0

무슨 langage/SDK에 대해 이야기하고 있습니까? –

+0

죄송합니다, 세부 사항을 잊어 버린 문제가 너무 깊었습니다 ... 프로젝트는 C# 및 WPF입니다. .NET 3.5을 사용 중입니다. 모든 아이디어를 얻을 수 있습니다. – pavele

+0

나는이 문제도 다루고 있으며, [다른 문제]와 관련이 있다고 생각합니다. (http://social.msdn.microsoft.com/Forums/vstudio/en-US/d9fdf56c-a651-4c9b-b0c6- 9a74eca3840d/읽기 전용 속성 선택 - on-a-flowdocumentscrollviewer 포럼 = wpf # 2960f16a-c66d-4ef7-b91a-eadb655a3762) 여기서 사용자가 창을 클릭하기 전에 선택을 설정할 수 없습니다. 마이크로 소프트가 이러한 문제를 수정하지 않는다는 것은 상당히 좌절스러운 일입니다. WPF와 같은 느낌은 소수의 소수에서만 사용됩니다. –

답변

0

Keyboard.Focus(richTextBox) 또는 richTextBox.Focus()을 사용하여 RichTextBox (?) 포커스를 먼저 줄 수는 없습니까?

+0

물론 나는 그것을 먼저 시도했다. 도움이되지 않습니다. 하지만 그렇게하더라도 응용 프로그램 UI 컨텍스트에서 정확하지 않을 수 있습니다 (포커스 변경). – pavele

1

내 경우에는 WPF UserControls를 사용하여 주로 Windows Forms 솔루션 내부에서 WPF를 실행하고있어 순수 WPF 환경에서 작동하는지 확실하지 않은 해결 방법을 찾았습니다.

BringIntoFocus()를 즉시 호출하는 대신 나중에 타이머에 의해 처리되는 큐에 추가하여 연기합니다. 예를 들어 :

System.Windows.Forms.Timer DeferredActionTimer = new System.Windows.Forms.Timer() { Interval = 200 }; 

Queue<Action> DeferredActions = new Queue<Action>(); 

void DeferredActionTimer_Tick(object sender, EventArgs e) { 
    while(DeferredActions.Count > 0) { 
    Action act = DeferredActions.Dequeue(); 
    act(); 
    } 
} 
폼의 생성자에서

, 또는 OnLoad 이벤트에 추가 : 마지막으로

DeferredActionTimer.Tick += new EventHandler(DeferredActionTimer_Tick); 
DeferredActionTimer.Enabled = true; 

를 대신 직접 TextPointer.Paragraph.BringIntoView();를 호출, 다음과 같이 호출 :

DeferredActions.Enqueue(() => TextPointer.Paragraph.BringIntoView()); 

주 Windows Forms 타이머가 (메시지 펌프 루프를 통해) 주 스레드에서 이벤트를 끕니다. 다른 타이머를 사용해야하는 경우 약간의 추가 코드가 필요합니다. System.Threading.Timer이 아닌 System.Timers.Timer을 사용하는 것이 좋습니다 (좀 더 스레드로부터 안전함). Dispatcher.Invoke 구조로 작업을 래핑해야합니다. 제 경우에는 WinForms 타이머가 매력처럼 작동합니다.