我的 MyContainer 用户控件里面有网格。此Grid的每个单元格都包含一个从 MyControlBase 类派生的控件。这些控件是动态添加的。
我需要在 MyContainer 中实现 FocusedControl 绑定属性,以获得当前关注或设置焦点到 MyControlBase 子项中的任何一个。我知道 FocusManager.FocusedElement ,但没有想法如何正确实现它。
答案 0 :(得分:0)
Dunno如果这有助于你的情况,或者它甚至是正确的方式来解决我的问题,但是在紧要关头我发现在我想要关注的对象上侦听Loaded事件然后使用Dispatcher.BeginInvoke来在后台发送一个Focus请求给我的控件,或者当其他方法没有时,ApplicationIdle优先级已经有效。例如:
private void MyControlLoaded(object sender, RoutedEventArgs e)
{
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action( () => MyControl.Focus() ));
}
答案 1 :(得分:0)
好的,我发现自己该怎么做。
首先像往常一样定义新的依赖属性FocusedAdapterProperty
:
public static readonly DependencyProperty FocusedAdapterProperty;
static SpreadGridControl()
{
FocusedAdapterProperty = DependencyProperty.Register("FocusedAdapter",
typeof(object), typeof(SpreadGridControl),
new FrameworkPropertyMetadata(null, null));
}
public object FocusedAdapter
{
get { return GetValue(FocusedAdapterProperty); }
set { SetValue(FocusedAdapterProperty, value); }
}
接下来将GotFocus处理程序添加到父容器,例如<Grid GotFocus="Grid_OnGotFocus">
检查 e.OriginalSource 并搜索所需类型的最常见祖先并将属性设置为新值:
private void Grid_OnGotFocus(object sender, RoutedEventArgs e)
{
var control = UIHelpers.TryFindParent<ControlBase>
((DependencyObject)e.OriginalSource);
if (control != null)
FocusedAdapter = control.Adapter;
}
可以找到 TryFindParent 的实现here