C# Winforms смелый древовидный узел не показывает весь текст
Я использую следующий код, чтобы сделать мои триоды жирными:
Font font = new Font(tvQuestionSequence.Font, FontStyle.Bold);
foreach (QuestionnaireBuilder_Category cat in categories)
{
TreeNode node = new TreeNode();
node.Text = cat.Description;
node.Name = cat.Id.ToString();
node.NodeFont = font;
tvQuestionSequence.Nodes.Add(node);
}
Но текст полужирных узлов отображается некорректно. Последние буквы не отображаются. Как так? И как решить эту проблему?
14 ответов
Я обнаружил, что это проблема Windows. Обойти эту проблему можно так:
В конструкторе формы установите шрифт древовидного представления жирным шрифтом. При добавлении узлов, которые не должны быть выделены жирным шрифтом, измените шрифт на обычный:
// Constructor of your form
public Form()
{
InitializeComponent();
Font font = new Font(tvQuestionSequence.Font, FontStyle.Bold);
tvQuestionSequence.Font = font;
}
// Add regular nodes (not bold)
Font font = new Font(tvQuestionSequence.Font, FontStyle.Regular);
TreeNode treeNode = new TreeNode();
treeNode.Text = "Foo";
treeNode.NodeFont = font;
TreeNode parent = tvQuestionSequence.Nodes.Find("parent", true);
parent.Nodes.Add(treeNode);
Я нашел это сообщение при поиске в Интернете, потому что столкнулся с точно такой же проблемой.
Тем не менее, добавление пробела в конец узла не было возможным, и я нашел альтернативный способ, который, похоже, решил проблему.
После установки шрифта моего узла Bold все, что мне нужно сделать, это сбросить текст узла с тем же значением.
Вот пример кода:
Font boldFont = new Font(treeview.Font, FontStyle.Bold);
node.NodeFont = boldFont;
node.Text = node.Text;
Кажется, что узел перерисовывается после изменения текста, что я и хотел в первую очередь.
Просто используйте treeView.BeginUpdate() перед выделением узла, затем treeView.EndUpdate() после выделения узла.
Это известная ошибка Windows. Простое решение - просто добавить дополнительный символ пробела в конце вашей строки. Символ пробела не будет виден, но он увеличит количество пикселей, необходимое для рисования строки, поэтому будет видна вся строка.
Я согласен с предоставленным решением. Я просто хочу добавить к этому, чтобы пролить немного больше света на проблему. Древовидное представление имеет свой собственный шрифт, который определяет ширину элементов на корневом уровне. Это компенсирует тот факт, что доступно только свойство высоты элемента и свойство ширины элемента.
Решение вашей проблемы состоит в том, чтобы определить, каким должен быть шрифт корневого узла, а затем установить дерево на тот же шрифт. Вы можете сделать это и во время разработки.
Надеюсь, что это помогает кому-то.
Это все не помогает мне. Какой трюк сделал шрифт немного больше и жирнее во время разработки. (В окне свойств)
Поэтому убедитесь, что вы определили древовидную структуру с достаточно большим шрифтом, а затем вы можете добавить узлы с меньшим шрифтом. Они подойдут.
Обойти эту проблему можно так:
Установите шрифт по умолчанию для дерева дерева, чтобы выделять жирным шрифтом в свойствах.
И не смей, когда нужно.
Я делаю следующее: я устанавливаю событие DrawNode для вызова, оно устанавливает жирный узел и удаляет выделенный цвет.
Вы можете установить любой понравившийся вам цвет, используя первый параметр функции e.Graphics.FillRectangle.
private void SetNodeBoldWhenSelected(object sender, DrawTreeNodeEventArgs e)
{
if (e.Node == null) return;
var font = e.Node.NodeFont ?? e.Node.TreeView.Font;
if (e.Node.IsSelected)
{
font = new Font(font, FontStyle.Bold);
}
var bounds = new Rectangle( e.Bounds.X,e.Bounds.Y,e.Bounds.Width+20,e.Bounds.Height);
e.Graphics.FillRectangle(SystemBrushes.ControlDarkDark, bounds);
TextRenderer.DrawText(e.Graphics, e.Node.Text, font, bounds, SystemColors.HighlightText, TextFormatFlags.GlyphOverhangPadding);
}
Теперь, когда я выбираю узел, я получаю на 20 пикселей больше места, для моего шрифта это работает хорошо, можно вычислить необходимый "реальный" размер, но нет никакой спецификации, заявляющей, что это необходимо сделать, но вы можете использовать Graphics.MeasureString, если вы чувствую, что тебе нужно это сделать.
На основании библиотеки MSDN попробуйте изменить код на:
Font font = new Font(tvQuestionSequence.Font, FontStyle.Bold);
foreach (QuestionnaireBuilder_Category cat in categories)
{
TreeNode node = new TreeNode();
node.Text = cat.Description;
node.Name = cat.Id.ToString();
node.NodeFont = font;
tvQuestionSequence.BeginUpdate(); //added newline here <--
tvQuestionSequence.Nodes.Add(node);
tvQuestionSequence.EndUpdate(); //added newline here <--
}
Это работает для меня
Я понимаю, что это старая тема, и на нее, возможно, ответили. Я только столкнулся с этой проблемой, поскольку я учусь использовать TreeViews. Для меня работало изменение размера шрифта для всего TreeView на тот же размер или больше, чем шрифт уровня, который вы хотите выделить жирным шрифтом. Размер шрифта по умолчанию составляет 8. что-то. Я изменил свой на 10, который был размером, который я хотел, чтобы мои узлы, и усечение исчезло.
Очень просто и отлично работает
treeView1.SelectedNode.NodeFont = new System.Drawing.Font(treeView1.SelectedNode.TreeView.Font, treeView1.SelectedNode.TreeView.Font.Style | FontStyle.Bold);
this.treeView1.SelectedNode.Text += string.Empty;
Я попробовал некоторые предложенные решения; BeginUpdate/EndUpdate, измените текстовое свойство. У меня они не сработали. Решение, которое сработало, я нашел здесь: https://www.codeproject.com/Questions/373949/Change-the-length-of-node-selection-in-treeview . Решение заключалось в установке TreeView.BackColor = Color.Empty, когда Видимость TreeView стала реальностью
Обработчик событий для VisibleChanged:
private void treeView_VisibleChanged(object sender, System.EventArgs e)
{
if (((TreeView)sender).Visible == true)
treeViewOrders.BackColor = Color.Empty;
}
Это в vb.Net, однако решение для повторного ввода значения поля TEXT прекрасно справляется с этой задачей. Как в:
With myNode
Dim myText As String = .Text 'capture the text
.NodeFont = New Font(<name of your treeview>.Font, FontStyle.Bold)
.Text = myText 'reset the text to the original value
End With
Что сработало для меня: подключение к событию load в конструкторе Control и настройка узла, как объяснено в ответе BlunT.
public MyControl()
{
InitializeComponent();
_head = new TreeNode();
this.Load += (s, e) =>
{
trvParts.Nodes.Clear();
_head.NodeFont = new Font(trvParts.Font, FontStyle.Bold);
trvParts.Nodes.Add(_head);
_head.Text = "Node Name";
};
}