【发布时间】:2021-10-10 19:43:19
【问题描述】:
我有一个TabControl,我正在尝试允许用户更改选项卡名称...但仅在双击名称时。这样,用户可以单击不同的选项卡名称来简单地更改活动选项卡,还可以根据需要更改选项卡名称。
到目前为止我尝试过的是捕获MouseDoubleClick 和LostFocus 事件,然后仅在双击选项卡名称时将“Focusable”属性设置为true。此方法的问题是LostFocus 事件在双击后立即触发,可能是因为焦点被设置为 TabItem 的内容。
我的选项卡控件 XAML:
<Mah:MetroAnimatedTabControl x:Name="ViewTabs" DataContext="{Binding MyTabsViewModel}" ItemsSource="{Binding}">
<Mah:MetroAnimatedTabControl.ItemTemplate>
<DataTemplate DataType="{x:Type viewModels:MyTabViewModel}">
<TextBox x:Name="TabNameTextBox"
Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
MouseDoubleClick="TabNameTextBox_MouseDoubleClick"
LostFocus="TabNameTextBox_LostFocus"
Cursor ="Arrow"/>
</DataTemplate>
</Mah:MetroAnimatedTabControl.ItemTemplate>
</Mah:MetroAnimatedTabControl>
事件MouseDoubleClick和Lost Focus背后的代码:
private void TabNameTextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var textBox = (TextBox)sender;
textBox.Focusable = true;
textBox.Focus();
textBox.SelectAll();
}
private void TabNameTextBox_LostFocus(object sender, RoutedEventArgs e)
{
var textBox = (TextBox)sender;
textBox.Focusable = false;
}
我发现了一个similar question,其中提问者无法触发Lost Focus 事件。在我的情况下,它在我预期之前就开始了。
【问题讨论】:
-
我会尝试以 MVVM 方式执行此操作,基本上将属性添加到
viewModels:MyTabViewModel类似于IsRenaming,然后当您处理鼠标双击时更改IsRenaming的值,这将基本上隐藏一个标签并使用Mah:MetroAnimatedTabControl.ItemTemplate等中的绑定显示一个文本框
标签: c# wpf xaml tabcontrol tabitem