在用户界面,有些时候需要使用键盘某个按键触发某项功能,但有时候会有焦点丢失问题发生,解决办法如下:
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(); } })); }); }