2

ユーザーがタブを押したときに、エキスパンダー内の最初の要素にフォーカスする必要があるというこの要件があります。

現在 (既定の動作) フォーカスはエキスパンダーに移動します。次のように、エキスパンダーにフォーカス イベント ハンドラーを作成して、エキスパンダーの最初の要素にフォーカスしようとしました。

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);

ただし、2回目のみ機能します(エキスパンダーが少なくとも1回開かれた場合)

これをスレッドやその他のクレイジーなアイデアに入れようとしました。

エキスパンダーの最初の要素にフォーカスを与えるにはどうすればよいですか? (エキスパンダーを初めて閉じたとき)

4

2 に答える 2

6

私はいくつかの方法を試しましたが、どれも機能しませんでした。基本的に問題は、エキスパンダーが(初期に)拡張されているときにTextBoxがまだレンダリングされていることです。

代わりに、私が見つけたのは、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);
}
于 2012-05-30T13:11:32.180 に答える
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);
        }
}
于 2012-05-30T08:43:27.883 に答える