我在WPF中创建了一个自动完成文本框作为用户控件。我使用弹出窗口来确保我的列表框始终位于其他控件的顶部。
如果将用户控件放在TabControl的不同TabItem上,我会意识到行为不清楚。
我创建了一个简单的示例来说明这一点。我在两个具有相同XAML的不同tab控件上放置了一个弹出窗口。
<TabControl>
<TabItem Header="Tab_0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<TextBox Name="ParentTextBox_Tab_0" Grid.Row="0" HorizontalAlignment="Stretch"/>
<Popup Name="PopupTest_Tab_0" IsOpen="True"
PlacementTarget="{Binding ElementName = ParentTextBox_Tab_0 }"
Placement="Bottom">
<TextBox Name="PU_TextBox_Tab_0" Text="PU_TextBox_Tab_0-Text"/>
</Popup>
</Grid>
</TabItem>
<TabItem Header="Tab_1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<TextBox Name="ParentTextBox_Tab_1" Grid.Row="0" HorizontalAlignment="Stretch"/>
<Popup Name="PopupTest_Tab_1" IsOpen="True"
PlacementTarget="{Binding ElementName = ParentTextBox_Tab_1 }"
Placement="Bottom">
<TextBox Name="PU_TextBox_Tab_1" Text="PU_TextBox_Tab_1-Text"/>
</Popup>
</Grid>
</TabItem>
</TabControl>
任何人都可以帮助解释这种行为的原因吗?
更新1
基于以下评论,我添加了以下内容:
private void ParentTextBox_Tab_0_GotFocus(object sender, RoutedEventArgs e)
{
PopupTest_Tab_0.IsOpen = true;
}
private void ParentTextBox_Tab_1_GotFocus(object sender, RoutedEventArgs e)
{
PopupTest_Tab_1.IsOpen = true;
}
尽管如此-当我第一次进入Tab1时(并调用了GotFocus方法),弹出窗口不会显示。
当我使用GotFocus处理程序返回Tab0时,将显示弹出窗口。
这正是我的用户控件所面临的问题(请记住,这里的代码只是一个简单的示例)。
更新2
有了该代码,它就可以工作-但这对我来说还是没有道理的...
private void ParentTextBox_Tab_1_GotFocus(object sender, RoutedEventArgs e)
{
PopupTest_Tab_1.IsOpen = false;
PopupTest_Tab_1.IsOpen = true;
}