C # Winforms смелый древовидный узел не показывает весь текст - PullRequest
52 голосов
/ 16 февраля 2010

Я использую следующий код, чтобы сделать мои триоды жирными:

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);
}

Но текст полужирных узлов отображается неправильно. Последние буквы не отображаются. Как так? И как решить эту проблему?

Ответы [ 13 ]

60 голосов
/ 27 апреля 2011

Я нашел это сообщение при поиске в Интернете, потому что столкнулся с точно такой же проблемой.

Тем не менее, добавление пробела в конец узла не было вариантом, и я нашел альтернативный способ, который, похоже, решил проблему.

После установки шрифта моего узла Bold все, что мне нужно сделать, это сбросить текст узла с тем же значением.

Вот пример кода:

Font boldFont = new Font(treeview.Font, FontStyle.Bold);
node.NodeFont = boldFont;
node.Text = node.Text;

Кажется, что узел перерисовывается после изменения текста, что я и хотел в первую очередь.

17 голосов
/ 16 февраля 2010

Я обнаружил, что это проблема 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);
6 голосов
/ 29 декабря 2016

Просто используйте treeView.BeginUpdate () перед выделением узла, а затем treeView.EndUpdate () после выделения узла.

5 голосов
/ 26 июня 2010

Это известная ошибка Windows. Простое решение - просто добавить дополнительный пробел в конце ваших строк. Символ пробела не будет виден, но он увеличит количество пикселей, необходимое для рисования строки, поэтому будет видна вся строка.

3 голосов
/ 05 января 2014

Я согласен с предоставленным решением. Я просто хочу добавить к этому, чтобы пролить немного больше света на проблему. Древовидное представление имеет свой собственный шрифт, который определяет ширину элементов на корневом уровне. Это компенсирует тот факт, что доступно только свойство высоты элемента и свойство ширины элемента.

Решение вашей проблемы состоит в том, чтобы определить, каким должен быть шрифт корневого узла, а затем установить дерево на тот же шрифт. Вы можете сделать это и во время разработки.

Надеюсь, это кому-нибудь поможет.

3 голосов
/ 13 ноября 2012

Это все не помогает мне. Какой трюк сделал шрифт немного больше и жирнее во время разработки. (В окне свойств)

Поэтому убедитесь, что вы определили древовидную структуру с достаточно большим шрифтом, а затем вы можете добавить узлы с меньшим шрифтом. Они подойдут.

2 голосов
/ 15 июля 2014

Обойти эту проблему можно следующим образом:

Установите в свойствах шрифт по умолчанию для дерева дерева жирным шрифтом.

И chnage не жирным шрифтом, когда вам нужно.

1 голос
/ 26 января 2018

На основе MSDN Library , попробуйте изменить код на:

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 <--
}

Это работает для меня

1 голос
/ 22 ноября 2017

Я делаю следующее, я устанавливаю событие 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, если вы чувствуете, что должны это сделать.

0 голосов
/ 20 октября 2016

Это в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...