如何在没有单击事件的情况下使特定的 TabItem 获得对 TabControl 的关注?

Posted

技术标签:

【中文标题】如何在没有单击事件的情况下使特定的 TabItem 获得对 TabControl 的关注?【英文标题】:How can I make a specific TabItem gain focus on a TabControl without click event? 【发布时间】:2010-11-16 15:53:01 【问题描述】:

如何告诉我的 TabControl 将焦点设置到它的第一个 TabItem,如下所示:

伪代码:

((TabItem)(MainTabControl.Children[0])).SetFocus();

【问题讨论】:

【参考方案1】:

这个怎么样?

MainTabControl.SelectedIndex = 0;

【讨论】:

在我的例子中,当我使用数据网格时,某些东西会锁定选择或焦点,所以我需要将其包装到对 Dispatcher 的调用中。 这个答案没有设置焦点,只有选择。【参考方案2】:
this.tabControl1.SelectedTab = this.tabControl1.TabPages["tSummary"];

我发现最好的做法是命名您的选项卡并通过名称访问它,这样如果/当其他人(或您)在更新过程中添加或删除选项卡时,您就不必去通过您的代码并找到并修复所有这些“硬编码”索引。希望这会有所帮助。

【讨论】:

这个答案适用于 WinForms,而不是 OP 在其标签中指定的 WPF。【参考方案3】:

我意识到这个问题很久以前就得到了回答,但是更好的解决方案是将您的项目绑定到模型中的集合并公开所选项目绑定到的属性。

XAML:

<!-- MyTemplateForItem represents your template -->
<TabControl ItemsSource="Binding MyCollectionOfItems"
            SelectedItem="Binding SelectedItem"
            ContentTemplate="StaticResource MyTemplateForItem">
</TabControl>

代码背后:

public ObservableCollection<MyItem> MyCollectionOfItems 
    get;
    private set;


private MyItem selectedItem;
public MyItem SelectedItem
    get  return selectedItem; 
    set 
        if (!Object.Equals(selectedItem, value)) 
            selectedItem = value;
            // Ensure you implement System.ComponentModel.INotifyPropertyChanged
            OnNotifyPropertyChanged("SelectedItem");
        
    

现在,设置项目所需要做的就是:

MyItem = someItemToSelect;

您可以对SelectedIndex 属性使用相同的逻辑,此外,您可以同时使用两者。

这种方法允许您将模型与 UI 正确分离,这样您就可以将 TabControl 替换为其他内容,但不需要您更改基础模型。

【讨论】:

【参考方案4】:

查看选项卡控件的属性... 展开 TabPages 属性“集合”... 记下您给成员起的名字。

即。一个名为 tabMain 的选项卡控件,带有两个名为 tabHeader 和 tabDetail 的选项卡

然后选择任一选项卡...您必须使用选项卡名称进行设置

tabMain.SelectedTab = tabHeader;

【讨论】:

【参考方案5】:
tabControl1.SelectedTab = item;
item.Focus();

【讨论】:

设置选中的Item后使用item.Focus()有什么好处? @HugoEstrada 焦点和选择不是一回事。根据这些属性中的每一个创建几个触发器以了解我的意思。或查看我的相关问题:***.com/q/58207987/2596334【参考方案6】:

tabControl.SelectedItem = tabControl.Items[0];

【讨论】:

【参考方案7】:

如果你有一个名为 tabControl 的 Tabcontroller,你可以通过不同的方法设置 selectedIndex,我主要使用以下方法。

代码隐藏:

tabControl.SelectedIndex = 0; // Sets the focus to first tabpanel

客户端:

首先,将以下 javascript 放入您的 aspx/ascx 文件中:

<script type="text/javascript">
function SetActiveTab(tabControl, activeTabIndex) 
    var activeTab = tabControl.GetTab(activeTabIndex);
    if(activeTab != null)
        tabControl.SetActiveTab(activeTab);
</script>

然后将以下客户端事件添加到首选控制器:

OnClientClick="function(s, e)  SetActiveTab(tabControl, 0);

【讨论】:

这个问题与 WPF 有关,但是您的答案是 ASP.NET 特定的。【参考方案8】:

最好使用以下类型的代码来选择特定的 特定选项卡中的项目...

.

 private void PutFocusOnControl(Control element)
        
            if (element != null)
                Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input,
                    (System.Threading.ThreadStart)delegate
                    
                        element.Focus();
                    );
        

在调用的时候... tabcontrol.isselected=true; PutFocusOnControl(textbox1);

可以正常工作...

【讨论】:

【参考方案9】:

这里的所有答案基本上都涉及SELECTION,它不回答问题。 也许这就是 OP 想要的,但这个问题非常具体地要求 FOCUS

TabItem item = (TabItem)MainTabControl.Items[0];
// OR
TabItem item = (TabItem)MainTabControl.SelectedItem;
// Then
item.Focus();

【讨论】:

这似乎是唯一明智的答案,但是:我的 Items[] 集合不包含 TabITem 的实例,(这太有意义了,)它包含视图模型,因为我正在使用ItemsSource="Binding...SelectedItem="Binding...——你们有解决方案吗?【参考方案10】:

Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As EventArgs) 处理 TabControl1.SelectedIndexChanged 'MsgBox(TabControl1.SelectedIndex)

    If TabControl1.SelectedIndex = 0 Then
        txt_apclntFrstName.Select()
    Else
        txtApplcnNo.Select()
    End If


End Sub

【讨论】:

【参考方案11】:

在我打开它后将焦点设置到最后一个标签对我很有用:

//这是我将集合分配给选项卡控件 DictTabControl.DataContext = appTabs.DictTabs;

//将选中的项设置为集合中的最后一项,即我刚刚添加到最后的一项。 DictTabControl.SelectedItem = DictTabControl.Items[(DictTabControl.Items.Count-1)];

【讨论】:

以上是关于如何在没有单击事件的情况下使特定的 TabItem 获得对 TabControl 的关注?的主要内容,如果未能解决你的问题,请参考以下文章

WPF中tabControl如何切换TabItem

如何在没有固定高度的情况下使动态div溢出

如何在不发送错误的情况下使按钮转到另一个视图控制器?

如何在没有合并提交或使用 CLI 的情况下使 GitHub 分叉保持最新?

如何在给定表达式的情况下使文本框空白而不是隐藏?

VueJS - 如何在没有任何硬代码的情况下使组件完全动态化