Подтвердить что ты не робот

С# Winforms bold treeview node не отображает весь текст

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

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

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

4b9b3361

Ответ 1

Я обнаружил, что это проблема с 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);

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Ответ 4

Это все не помогает мне. То, что сделал трюк, делает шрифт немного большим и смелым в DESIGN время. (В окне "Свойства" )

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

Ответ 5

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

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

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

Ответ 6

Очень просто и отлично работает

treeView1.SelectedNode.NodeFont = new System.Drawing.Font(treeView1.SelectedNode.TreeView.Font, treeView1.SelectedNode.TreeView.Font.Style | FontStyle.Bold);
           this.treeView1.SelectedNode.Text += string.Empty;

Ответ 7

Обходной путь для этой проблемы заключается в следующем:

Задайте шрифт defaul дерева для жирного шрифта в свойствах.

И чтобы не было полужирным, если вам нужно.

Ответ 8

Я понимаю, что это старая нить, и на нее, возможно, ответили. Я просто столкнулся с этой проблемой, поскольку я учусь использовать TreeViews. Для меня это изменило размер шрифта для всего TreeView с тем же размером или больше, чем шрифт уровня, который вам нужен. Размер шрифта по умолчанию - 8.something. Я поменял мой на 10, что было размером с моими узлами, и усечение исчезло.

Ответ 9

Что сработало для меня: присоединяется к событию загрузки в конструкторе Control и настраивает node, как описано в ответе 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";
    };
}

Ответ 10

В 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

Ответ 11

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

Ответ 12

Я делаю следующее: я устанавливаю событие DrawNode для вызова, он устанавливает node полужирным шрифтом и удаляет выделенный цвет.

Вы можете установить любой цвет, который вам нравится, используя первый параметр функции 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);
}

Теперь, когда я выбираю node, я получаю 20 пикселей больше места, для моего шрифта это хорошо работает, можно вычислить требуемый "реальный" размер, но нет спецификации, указывающей на необходимость этого, но вы можете использовать Graphics.MeasureString, если вы считаете, что вам нужно это сделать.