WPF项目控制-添加项目时更改焦点

本文关键字:项目 焦点 添加 控制 WPF | 更新日期: 2023-09-27 18:27:08

我有一个名为Pages的ObservableCollectiong<StringWrapper>(StringWrapper per this post)绑定到ItemsControl,该ItemsControl的ItemTemplate只是绑定到StringWrapper.Text的TextBox。

XAML

<ItemsControl Name="icParagraphs" Grid.Column="1" Grid.Row="7" ItemsSource="{Binding Path=Paragraphs, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}">
    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <StackPanel Orientation="Vertical">
                <ItemsPresenter />
            </StackPanel>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
                <TextBox Name="tbParagraph" TextWrapping="Wrap" AcceptsReturn="False" Text="{Binding Path=Text}" Grid.Column="0" KeyUp="tbParagraph_KeyUp" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

C#

public class StringWrapper
{
    public string Text { get; set; }
    public StringWrapper()
    {
        Text = string.Empty;
    }
    public StringWrapper(string text)
    {
        Text = text;
    }
}

我试图做到这一点,当我在TextBox中按enter键时,我会在绑定到当前关注的TextBox的StringWrapper之后,在我的ObservableCollection中插入一个StringWrappers,从而生成一个新的TextBox。到目前为止,我的代码可以做到这一点,尽管还有一些小故障需要解决。

我的问题是,然后如何将焦点设置为新生成的TextBox据我所知,控件的生成发生在插入字符串的函数返回之后。

我查找了类似ItemsControl.ItemsSourceChanged事件的内容,但至少该名称不存在。我还尝试将一个处理程序附加到ObservableCollection.CollectionChanged,但这似乎也在生成TextBox之前触发了。最后,由于ItemsControl.Template是StackPanel,我查找了StackPanel.ControlAdded事件,但也找不到。

想法?谢谢

WPF项目控制-添加项目时更改焦点

您可能需要处理CollectionChanged,然后使用优先级为LoadedDispatcher.BeginInvoke来安排将来发生的焦点操作。这应该给ItemsControl一个生成容器并执行布局的机会。