2012-05-29 73 views
2

我有這個需求,當我需要在用戶按下tab時將第一個元素集中在擴展器內部。把焦點放在擴展器內部的一個組件

目前(默認行爲)的重點轉到擴展,我已經試過在擴張這樣創造一個焦點事件處理程序來關注擴展的第一個元素:

private void ExpanderGotFocus(object sender, RoutedEventArgs e) 
{ 
    var expander = (Expander) sender; 

    if (!expander.IsExpanded) 
    { 
     expander.IsExpanded = true; 
     this._someText.Focus(); 
    }   
} 

哪個沒有按」工作。

我也試圖給焦點的下一個元素:

var tRequest = new TraversalRequest(FocusNavigationDirection.Next); 
var keyboardFocus = Keyboard.FocusedElement as UIElement; 
keyboardFocus.MoveFocus(tRequest); 

但只適用我已經試過第二次(當擴展已經至少打開一次)

把它放在一個線索和其他一些瘋狂的想法。

我該如何關注第一個元素裏面的擴展器? (第一次擴關閉)

回答

0

檢查用以下,

XAML代碼:

<StackPanel> 
     <Expander Header="Expander" 
        Name="expander" 
        Collapsed="OnCollapsed" 
        IsExpanded="True" > 
      <StackPanel> 
       <TextBox Text="Text1" Name="textBox1" /> 
       <TextBox Text="Text2" Name="textBox2" /> 
       <TextBox Text="Text3" Name="textBox3" /> 
      </StackPanel> 
     </Expander> 
     <TextBox Text="Text4" Name="textBox4" /> 
</StackPanel> 

in the code behind: 
public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      this.Loaded += delegate 
      { 
       textBox2.Focus(); 
      }; 
     } 
     private void OnCollapsed(object sender, RoutedEventArgs e) 
     { 
      var element = Keyboard.FocusedElement; 
      if (element != null) 
      { 
       //now is the ToggleButton inside the Expander get keyboard focus 
       MessageBox.Show(element.GetType().ToString()); 
      } 
      //move focus 
      Keyboard.Focus(textBox4); 
     } 
} 
+0

請在此文章中包含此處所需的步驟說明,否則可能會被刪除爲[「未回答」](http://meta.stackexchange.com/q/8259)。如果您願意,您可能仍然包含鏈接,但僅作爲「參考」。 –

6

我嘗試了幾種方法,其中沒有工作,基本問題是文本框仍是當擴展器擴展時(提前)渲染。

所以不是什麼我發現是到IsVisibleChanged事件添加到文本框所以當擴張完成文本變得可見,並要求重點

XAML

<Expander GotFocus="ExpanderGotFocus"> 
    <Expander.Header> 
     <TextBlock Text="{x:Static Client:Strings.XYZ}" /> 
    </Expander.Header> 
    <Expander.Content> 
     <StackPanel> 
      <TextBox IsVisibleChanged="ControlIsVisibleChanged" Name="txtBox" /> 
     </StackPanel> 
    </Expander.Content> 
</Expander> 

代碼背後

private void ExpanderGotFocus(object sender, RoutedEventArgs e) 
{ 
    var expander = (Expander) sender; 

    if (!expander.IsExpanded) 
    { 
     expander.IsExpanded = true; 
    } 
} 

private void ControlIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    Keyboard.Focus((IInputElement)sender); 
} 
+0

輝煌的方式男人..謝謝你..它的工作! – Sandepku

+0

非常感謝。 –