WPF:将焦点设置为ItemsControl内的控件

时间:2010-11-15 15:08:13

标签: c# wpf focus itemscontrol

我有ItemsControl绑定到数据源并生成多个容器。我正在使用代码来确保在任何给定时间只能看到其中一个容器。容器使用TemplateSelector,因此每个容器的内容是不同的(排除了按名称查找控件)。

我想将键盘焦点设置为当前可见容器中的第一个控件。我为每个容器的IsVisibleChanged事件添加了一个事件处理程序,但是当我访问VisualTree时,没有子项。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

只有在子元素本身可见后才能将焦点设置在子元素上。一种选择是找到要聚焦的子元素,然后在其IsVisibleChanged中添加一个处理程序。在处理程序中,聚焦对象,然后删除处理程序。

private void stackPanel1_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if (stackPanel1.IsVisible)
    {
        UIElement elm = stackPanel1.Children[0];
        FrameworkElement fwe = (FrameworkElement)elm;
        fwe.IsVisibleChanged += new DependencyPropertyChangedEventHandler(fwe_IsVisibleChanged);
    }
}

void fwe_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    FrameworkElement fwe = (FrameworkElement)sender;
    fwe.IsVisibleChanged -= new DependencyPropertyChangedEventHandler(fwe_IsVisibleChanged);
    Keyboard.Focus((IInputElement)sender);
}

编辑: 您应该能够访问IsVisibleChanged事件处理程序中的Items集合。

<ItemsControl Name="sp1" IsVisibleChanged="sp1_IsVisibleChanged" 
              ItemsSource="{Binding Items}" >
</ItemsControl>

使用此代码:

void sp1_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
     Console.WriteLine(sp1.Items.Count);
}