Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:将焦点设置为ItemsControl内的控件_C#_Wpf_Focus_Itemscontrol - Fatal编程技术网

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

C# WPF:将焦点设置为ItemsControl内的控件,c#,wpf,focus,itemscontrol,C#,Wpf,Focus,Itemscontrol,我有一个ItemsControl,它绑定到一个数据源并生成几个容器。我使用代码来确保在任何给定的时间只有一个容器可见。容器使用模板选择器,因此每个容器的内容都不同(这排除了按名称查找控件的可能性) 我想将键盘焦点设置为当前可见容器中的第一个控件。我已经为每个容器的IsVisibleChanged事件添加了一个事件处理程序,但是当我访问VisualTree时,没有子事件 有什么想法吗?只有在子元素本身可见后,才能对子元素设置焦点。一个选项是找到要聚焦的子元素,然后将处理程序添加到其IsVisibl

我有一个
ItemsControl
,它绑定到一个数据源并生成几个容器。我使用代码来确保在任何给定的时间只有一个容器可见。容器使用
模板选择器
,因此每个容器的内容都不同(这排除了按名称查找控件的可能性)

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


有什么想法吗?

只有在子元素本身可见后,才能对子元素设置焦点。一个选项是找到要聚焦的子元素,然后将处理程序添加到其
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>

我的问题是找到子元素。我所拥有的是一个ContentPresenter,它应该具有所选模板的控件,但它的可视化树似乎没有子级。我用一些访问items集合的代码编辑了答案。我已经测试过了,它是有效的-我意识到它和你描述的不同,但我认为这个概念是一样的。我是否应该删除我的答案,以便您有更好的机会得到回复?
void sp1_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
     Console.WriteLine(sp1.Items.Count);
}