WPF:将焦点设置到 ItemControl 内的控件

发布于 2024-10-02 04:04:59 字数 287 浏览 0 评论 0原文

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

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

有什么想法吗?

I have an ItemsControl that is bound to a datasource and generates several containers. I am using code to ensure that only one of the containers is visible at any given time. The containers use a TemplateSelector so the content of each container is different (which rules out finding the control by name).

I would like to set the keyboard focus to the first control in the currently visible container. I have added an event handler to the IsVisibleChanged event for each container but when I access the VisualTree there are no children.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

原谅我要高飞 2024-10-09 04:04:59

您只能在子元素本身变得可见后才能将焦点设置在子元素上。一种选择是找到您想要聚焦的子元素,然后向其 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);
}

You can only set focus on the child element after the child element itself has become visible. One option is to find the child element you want to focus, then add a handler to its IsVisibleChanged. In the handler, Focus the object and then remove the handler.

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);
}

Edit:
You should be able to access the Items collection in the IsVisibleChanged event handler.

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

With this code:

void sp1_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
     Console.WriteLine(sp1.Items.Count);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文