C# Winforms полужирный узел treeview не показывает весь текст



Я использую следующий код, чтобы сделать мои 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);
}


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

801   13  

13 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

просто используйте treeView.BeginUpdate () перед выделением жирным шрифтом узла затем treeView.EndUpdate () после того, как вы выделили узел жирным шрифтом.

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

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

и chnage не жирный, когда вам нужно.

на основе библиотека 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 <--
}

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

очень легко и работает отлично

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

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

что сработало для меня: подключение к событию load в конструкторе элемента управления и настройка узла, как описано в ответе Бланта.

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

это внутри vb.Net однако решение повторно ввести значение текстового поля получает вокруг этого красиво. Как в:

 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

Я делаю следующее, Я устанавливаю событие 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 пикселей больше места, для моего шрифта это хорошо работает, можно рассчитать "реальный" размер, но нет спецификации, в которой говорится, что это нужно сделать, но вы можете использовать графику.MeasureString если вы чувствую, что тебе нужно это сделать.

Comments

    Ничего не найдено.