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

Флажки Tri-State в WinForms TreeView

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

☑ Node 1
☐ Node 2
• Node 3
  ☑ Node 3.1
  ☑ Node 3.2
• Node 4
  ☐ Node 4.1
  ☑ Node 4.2

Но лучшим решением было бы использовать флажки tri-state для родительских узлов, например:

☑ Node 1
☐ Node 2
☑ Node 3
  ☑ Node 3.1
  ☑ Node 3.2
☒ Node 4
  ☐ Node 4.1
  ☑ Node 4.2

Поскольку эта функциональность была доступна в Win32, мой вопрос заключается в том, как это сделать, не рисуя сами ящики (например, как пользовательский элемент управления или using список изображений). Я вообще не знаком с API Win32; как бы расширить технологию, связанную выше, чтобы включить трио-state checboxes в управляемом элементе управления TreeView?

4b9b3361

Ответ 1

Вы просмотрели это? Кажется, это делает работу. Это может быть немного устаревшим (похоже, статья написана с 2004 года), но я уверен, что те же принципы могут быть расширены на все, что вам нужно.

Ответ 2

Этот код может помочь вам, если вы думаете о создании смешанного флажка

class MixedCheckBox:Control
{
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(0, 0), Bounds, 
            Text, Font, false, 
            System.Windows.Forms.VisualStyles.CheckBoxState.MixedNormal);
    }
}

Это сделает: enter image description here

Удачи!