Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将焦点放在扩展器内的组件上_C#_Wpf - Fatal编程技术网

C# 将焦点放在扩展器内的组件上

C# 将焦点放在扩展器内的组件上,c#,wpf,C#,Wpf,我有这样的要求,当用户按tab键时,我需要聚焦扩展器内的第一个元素 当前(默认行为)焦点转到扩展器,我尝试通过在扩展器中创建焦点事件处理程序来聚焦扩展器的第一个元素,如下所示: private void ExpanderGotFocus(object sender, RoutedEventArgs e) { var expander = (Expander) sender; if (!expander.IsExpanded) { expander.IsE

我有这样的要求,当用户按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);
但仅在第二次工作(扩展器至少打开一次时)

我试着把这个和其他一些疯狂的想法放在一起


如何将焦点放在扩展器内的第一个元素上?(膨胀机第一次关闭时)

检查以下各项:

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

在代码隐藏中:
公共部分类Window1:Window
{
公共窗口1()
{
初始化组件();
此.Loaded+=委托
{
textBox2.Focus();
};
}
已聚合的专用void(对象发送器、路由目标)
{
var元素=Keyboard.FocusedElement;
if(元素!=null)
{
//现在是扩展器内的切换按钮获取键盘焦点
Show(element.GetType().ToString());
}
//移动焦点
键盘。焦点(文本框4);
}
}

我尝试了几种方法,但没有一种有效,基本上问题是当扩展器扩展(到早期)时,文本框仍在渲染

因此,我发现的是将
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);
}