【问题标题】:WPF: Setting Focus To A Control Inside a ItemsControlWPF:将焦点设置到 ItemsControl 内的控件
【发布时间】:2010-11-15 15:08:12
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: c# wpf focus itemscontrol


    【解决方案1】:

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

    【讨论】:

    • 我的问题是找到子元素。我所拥有的是一个 ContentPresenter,它应该具有来自所选模板的控件,但它的可视化树似乎没有子级。
    • 我已经用一些访问项目集合的代码编辑了答案。我已经对此进行了测试并且它有效 - 我意识到它与您所描述的不同,但我认为这个概念是相同的。我是否应该删除我的答案,以便您有更好的机会获得回复?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2022-07-18
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多