TabItem LostFocus事件不是第一次激发的

本文关键字:第一次 LostFocus 事件 TabItem | 更新日期: 2023-09-27 18:08:41

我有一个TabControl和两个TabItem。我在第一个选项卡中运行Thread。当第一个选项卡失去焦点时,我必须挂起线程。但我对TabItemLostFocus事件有一个小问题。TabItem第一次失焦时不会触发LostFocus事件,而是第二次。为什么会这样?我如何让它第一次着火?

以下是我的xaml代码:

<Grid>
    <TabControl Name="tbc">
        <TabItem Name="tabMain" Header="Main" GotFocus="tabMain_GotFocus" LostFocus="tabMain_LostFocus" >
            <uc:ucMain />
        </TabItem>
        <TabItem Name="tabExplorer" Header="Data Explorer">
            <uc:ucExplorer />
        </TabItem>
    </TabControl>
</Grid>

在上面的代码中,uc:ucMain是一个UserControl

TabItem LostFocus事件不是第一次激发的

这似乎是一个奇怪的WPF行为。你可以通过强制聚焦你的第一个TabItem:来解决它

代码:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    tabMain.Focus();
}

TabItem在第一次打开时没有焦点。

因此,将焦点设置在TabItem的子元素上,在您的情况下,它是ucMain。在XAML本身的tabItem上设置FocusManager.FocusedElement属性。

<Grid>
    <TabControl Name="tbc">
        <TabItem Name="tabMain" Header="Main"
                 GotFocus="tabMain_GotFocus"
                 LostFocus="tabMain_LostFocus"
                 FocusManager.FocusedElement="{Binding ElementName=ucMain}" >
            <uc:ucMain x:Name="ucMain"/>
        </TabItem>
        <TabItem Name="tabExplorer" Header="Data Explorer">
            <uc:ucExplorer />
        </TabItem>
    </TabControl>
</Grid>

为第一个TabItemControl Name="tabMain"添加Loaded事件。

在这种情况下,添加下面提到的行。

tabMain.Focus((

由于TabControl在第一次加载时不会将焦点放在第一个选项卡项上,由于LostFocus事件没有被触发,所以第一个选项卡没有被聚焦,因为为了触发LostFocs事件GotFocus事件一次,它应该被触发。

因此允许将焦点明确到第一个选项卡项。