WPF 界面或文本框焦点丢失问题

发布时间 2023-09-19 18:30:48作者: 潇潇烟雨

在用户界面,有些时候需要使用键盘某个按键触发某项功能,但有时候会有焦点丢失问题发生,解决办法如下:

 

List<T> FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
{
            try
            {
                List<T> list = new List<T>();
                int childrenCount = VisualTreeHelper.GetChildrenCount(obj);
                for (int i = 0; i < childrenCount; i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                    if (child is T)
                    {
                        list.Add((T)child);
                        List<T> childOfChildren = FindVisualChild<T>(child);
                        if (childOfChildren != null)
                        {
                            list.AddRange(childOfChildren);
                        }
                    }
                    else
                    {
                        List<T> childOfChildren = FindVisualChild<T>(child);
                        if (childOfChildren != null)
                        {
                            list.AddRange(childOfChildren);
                        }
                    }
                }

                return list;
            }
            catch (Exception)
            {
                //MessageBox.Show(ee.Message);
                return null;
            }
}

private void GetFocusEvent()
{
    this.Focusable = true;
    this.Focus();
    var listtemp = FindVisualChild<TextBoxEx>(this);
    if (listtemp != null && listtemp.Count > 0)
    {
        var firstlist = listtemp.Where(x => x.Name == "txt").FirstOrDefault();
        if (firstlist != null)
        {
            firstlist.Focus();
        }
    }
}

 

或者:

void FindVisualChild()
        {
            Task.Factory.StartNew(() =>
            {
                TaskEx.Delay(100).Wait();
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    var listtb = FindVisualChild<TextBoxEx>(list);
                    bool find = false;
                    foreach (var item in listtb)
                    {
                        //不能退的行不需要选中效果
                        if (item.Visibility==Visibility.Visible && item.DataContext is Models.Dialogs.ListInfo model && model.Check && model.IsAdd)
                        {
                            item.Focus();
                            item.SelectAll();
                            find = true;
                        }
                    }

                    if (!find)
                    {
                        txt.Focus();
                    }
                }));
            });


        }