将焦点设置为新TabItem中的按钮

时间:2010-12-29 10:49:30

标签: c# wpf focus tabcontrol

我使用TabControl显示项目列表。 ItemView是我写的一个单独的控件。

       <TabControl SelectedItem="{Binding CurrentItem}"
                    IsSynchronizedWithCurrentItem="True"
                    ItemsSource="{Binding ItemList}">
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <ctrls:ItemView/>
                </DataTemplate>
            </TabControl.ContentTemplate>
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding ShortItemDescription}"/>
                </DataTemplate>
            </TabControl.ItemTemplate>
        </TabControl>

如果用户按下按钮,则会将新的ViewModel添加到ViewModel列表中,TabControl会将其显示为新选项卡。添加新标签后,选择了。

       <Button Command="{Binding AddItemCommand}"
               Content="Add item"/>

新视图内部是每次添加新标签时都需要聚焦的按钮。我试图在ItemView中使用FocusManager和Initialized事件,但这些仅在我第一次添加新标签时被调用。

<UserControl x:Class="ItemView"
         ...
         Initialized="ViewInitialized">
<Grid>
    ...

    <!-- Set focus to this button -->
    <Button Content="Search"
            Command="{Binding SearchCommand}"
            Name="SearchButton"
            Grid.Column="0"
            Grid.Row="0"/>
</Grid>
</UserControl>

有什么想法吗?

更新

ItemView中Initialize方法的内容目前是这个 - 这是第一次工作正常...... 然后再也没有

    public delegate void ChangeFocusDelegate();

    private void FocusSearchButton()
    {
        SearchButton.Focus();
    }

    private void ViewInitialized(object sender, EventArgs e)
    {
        ChangeFocusDelegate focusDelegate = FocusSearchButton;
        Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, focusDelegate);
    }

3 个答案:

答案 0 :(得分:1)

这应该是这样的(在你定义的UserControl的Initialized事件上):

private void ViewInitialized(object sender, System.EventArgs e)
{
    this.SearchButton.Focus();
}

答案 1 :(得分:0)

您需要在视图上订阅Loaded事件,并在事件处理程序方法中调用按钮上的Focus()。

答案 2 :(得分:0)

它看起来有点奇怪......
IsVisibleChanged ......没有反应
初始化......没有反应
加载......没有反应

然后我得到了解决方案。如果运行时为每个选项卡使用相同的View并仅将内部数据更改为另一个ViewModel,该怎么办?所以解决方案是:

    private void SameViewButDataContextChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
    {
        ChangeFocusDelegate focusDelegate = FocusFileSearchButton;
        Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, focusDelegate);
    }

每次添加标签时,焦点都会切换到“搜索”按钮。