我有ItemsControl
绑定到数据源并生成多个容器。我正在使用代码来确保在任何给定时间只能看到其中一个容器。容器使用TemplateSelector
,因此每个容器的内容是不同的(排除了按名称查找控件)。
我想将键盘焦点设置为当前可见容器中的第一个控件。我为每个容器的IsVisibleChanged
事件添加了一个事件处理程序,但是当我访问VisualTree
时,没有子项。
有什么想法吗?
答案 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);
}