WPF Grid和它内部的控件焦点

时间:2012-03-21 13:47:11

标签: c# wpf binding

我的 MyContainer 用户控件里面有网格。此Grid的每个单元格都包含一个从 MyControlBase 类派生的控件。这些控件是动态添加的。

我需要在 MyContainer 中实现 FocusedControl 绑定属性,以获得当前关注或设置焦点到 MyControlBase 子项中的任何一个。我知道 FocusManager.FocusedElement ,但没有想法如何正确实现它。

2 个答案:

答案 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