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