2016-12-16 38 views
1

最簡單的應用可能:如何在應用程序啓動時不關注元素?

<Page 
    x:Class="TestApp.MainPage" 
    ...> 
    <Grid> 
     <TextBox /> 
    </Grid> 
</Page> 

問:是否有任何優雅的方式,以防止光標(焦點)從應用的文本框被設置啓動?

展開:我真正的問題是,我有一個PopUp,當TextBox接收焦點時打開。如果我點擊PopUp中的某個元素,它應該關閉,但由於TextBox是我的頁面中第一個可聚焦元素,它會自動接收焦點,因此PopUp會立即再次打開。我認爲問題的核心是上面的例子。

+0

您可以將焦點放在哪些元素上?或者是文本框是您網站上唯一的控件? – HimBromBeere

+0

@HimBromBeere我猜可以通過編程將焦點放在TextBox後面的下一個元素上。但是,我有一個(在我看來)相當隨心所欲,並不是那麼優雅的解決方案。在最好的世界中,直到我點擊它或按下標籤之前,控件纔會被聚焦。但也許這不是事情的方式... –

回答

1

焦點由各種屬性管理,如IsTabStop,TabIndex,IsHitTestVisibleFocusManager類。一旦窗口被激活,就有內置的功能來聚焦第一個可聚焦元素,而這種行爲通常是不可定製的。

我們可以指定不同的元素集中,而不是文本框一樣,也就是說,網頁本身:

<Page IsTabStop="True"> 
    <TextBox/> 
</Page> 

這工作,因爲該頁面獲得最初的重點,而不是文本框,但現在該頁面參與標籤行爲,這是稍微不合需要的。

通常,當您單擊聚焦控件時,即使RootScrollViewer不是製表位(因此它無法通過製表符合焦),框架將焦點置於RootScrollViewer上。如果我們可以在頁面加載時關注RootScrollViewer,則框架將檢測到的某些內容具有焦點,並且不會嘗試集中第一個元素。

<Page Loaded="onPageLoaded"> 
    <TextBox/> 
</Page> 
private ScrollViewer getRootScrollViewer() 
{ 
    DependencyObject el = this; 
    while (el != null && !(el is ScrollViewer)) 
    { 
     el = VisualTreeHelper.GetParent(el); 
    } 

    return (ScrollViewer)el; 
} 

private void onPageLoaded(object sender, RoutedEventArgs e) 
{ 
    getRootScrollViewer().Focus(FocusState.Programmatic); 
} 

這是最「優雅」的方式,我知道,以防止文本從得到自動對焦。

+0

這我喜歡,謝謝! –

+0

我用你的RootScrollViewer代碼並將其包裝在一個行爲中。現在我想禁用初始焦點的任何頁面,我只是將行爲附加到頁面上。奇蹟般有效。謝謝! – ManOVision

相關問題