2008-10-07 91 views
0

我有一個WPF瀏覽器樣的應用程序與幾頁。當我在頁面之間切換時,我想設置鍵盤焦點。如何在WPF頁面重新載入中設置焦點?

當第一次加載頁面時,通過在構造函數中調用Control.Focus()來工作。

但是,當我的網頁之間切換,這並不工作了 - 焦點僅僅是第一場,而忽略我嘗試將其更改爲別的:(

的頁面具有屬性KeepAlive=true - 它會如果這樣可以讓焦點保持活躍狀態​​,但只是將焦點設置到第一個區域很煩人。

我試圖在加載的事件中設置焦點,但它也不起作用。在重新加載頁面後設置默認焦點。

有什麼方法可以設置重點進入第二次瀏覽頁面? 在類似瀏覽器的應用程序中切換WPF頁面時,應該如何以及在哪裏設置焦點

回答

0

因爲我發現沒有解決這個問題,我用一個簡單的解決方法:

我火了輔助線程,在頁面加載後,其改變的重點。

幸運的是,這是使用的BeginInvoke很容易實現:

myControl.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, 
(System.Threading.SendOrPostCallback)delegate(object state) 
{ 
    myControl.Focus(); 
}); 

這樣的工作比我預期它更好的,所以可能這個解決辦法將留在使用很長一段時間。

1

你有沒有嘗試在Loaded事件處理程序而不是構造函數中設置焦點?當您重新導航到頁面時頁面不會重新構建,但如果我正確記得,它們會重新加載。

+0

是的,我試圖設置Loaded事件的焦點 - 不工作了。 – Sam 2008-10-07 12:19:46

4

嘗試將FocusManager.FocusedElement =「{Binding ElementName = [...]}」`` 添加到頁面中的第一個元素,並設置應獲得焦點的元素的名稱。

1

經過「WPF初始焦點夢魘」並基於堆棧上的一些答案,以下證明對我來說是最好的解決方案。

首先,添加您的App.xaml中OnStartup()以下內容:

EventManager.RegisterClassHandler(typeof(Window), Window.LoadedEvent, 
      new RoutedEventHandler(WindowLoaded)); 

然後還加了 'WindowLoaded' 事件中的App.xaml:

void WindowLoaded(object sender, RoutedEventArgs e) 
    { 
     var window = e.Source as Window; 
     System.Threading.Thread.Sleep(100); 
     window.Dispatcher.Invoke(
     new Action(() => 
     { 
      window.MoveFocus(new TraversalRequest(FocusNavigationDirection.First)); 

     })); 
    } 

線程問題必須使用因爲WPF最初的重點大多因爲一些框架競爭條件而失敗。

我發現以下解決方案最好,因爲它是整個應用程序的全局使用。

希望它可以幫助...

奧蘭

+0

MoveFocus(新的TraversalRequest(FocusNavigationDirection。首先))是一種將焦點轉移到控制的第一個可調焦孩子的巧妙方法。愛它! – 2011-06-09 15:42:16