在WPF项目开发过程中,需要对TreeViewItem的Header进行重命名,但是其Header并不支持重命名,故使用Popup浮窗覆盖Header,在Popup中进行修改,完成修改后更新Header,如下图:
在实现过程中存在一个问题,如果Popup的宽度不设置最小值,在编辑Header过程中Popup随着文本长度而变化,可能会出现Popup无法对Header全覆盖,从而显现出底层的Header,但如果将Popup的宽度最小值设置为TreeViewItem的ActualWidth,则会导致Popup宽度较大,显得十分不美观,代码实现部分如下:
void TextBoxLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
(ScriptTree.SelectedItem as TreeViewItem).Header = (sender as TextBox).Text;
}
//TODO 右键菜单重命名
private void MenuItem_Rename_Click(object sender, RoutedEventArgs e)
{
TreeViewItem CurrentItem = ScriptTree.SelectedItem as TreeViewItem;
Popup NodeRenamePop = new Popup();
StackPanel RenamePanel = new StackPanel();
TextBox RenameTextBox = new TextBox();
RenameTextBox.LostKeyboardFocus += TextBoxLostKeyboardFocus;
NodeRenamePop.IsOpen = true;
NodeRenamePop.StaysOpen = false;
NodeRenamePop.PlacementTarget = CurrentItem;
NodeRenamePop.HorizontalOffset += 20;
NodeRenamePop.VerticalOffset -= CurrentItem.ActualHeight;
//NodeRenamePop.MinWidth = CurrentItem.ActualWidth - 120;
RenameTextBox.Text = CurrentItem.Header.ToString();
RenamePanel.Children.Add(RenameTextBox);
NodeRenamePop.Child = RenamePanel;
}