Изменить цвет переднего плана свойств только для чтения в сетке свойств - PullRequest
1 голос
/ 06 августа 2010

Я использую сетку свойств WinForms для отображения свойств объекта. Тем не менее, большинство свойств доступны только для чтения и поэтому отображаются скорее серыми, чем черными. Есть ли способ настроить используемые цвета? Мне бы хотелось, чтобы отключенные свойства были немного проще для чтения.

Кстати: я думаю, что ответ на этот вопрос может быть связан с тем, что я пытаюсь сделать. Но я не уверен, как именно я могу получить доступ к ControlPaint.DrawStringDisabled.

Ответы [ 3 ]

12 голосов
/ 25 июня 2012

Эта проблема имеет простое решение.

Просто уменьшите R в RGB для цвета ColorGrid Property, например:

Me.PropertyGrid2.ViewForeColor = Color.FromArgb(1, 0, 0)

Эта функция действует только на черный цвет.

1 голос
/ 06 августа 2010

К сожалению, нет встроенного способа изменить цвет.Как и многие стандартные элементы управления .NET, они представляют собой просто обернутые версии своих эквивалентов COM.

На практике это означает, что много, если не вся картина выполняется COM-компонентом, поэтому, если вы попытаетесь переопределить метод .NET OnPaint и вызвать ControlPaint.DrawStringDisabled или любую другую картинукод, скорее всего, он будет иметь нежелательный эффект, или не иметь никакого эффекта.

Ваши варианты:

  1. Создание пользовательского элемента управления с нуля (вероятно,Самый простой)
  2. Переопределить WndProc и попытаться перехватить сообщения рисования (работа не гарантируется)
  3. Попытка переопределить OnPaint и выполнить рисование сверху (работа не гарантируется)

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

0 голосов
/ 04 февраля 2017

Что это за колдовство? +1! Я видел другие решения, которые ловят мышь и клавиатуру. Это, безусловно, самое лучшее и простое решение. Вот фрагмент моего унаследованного элемента управления только для чтения.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace MyCustomControls
{
    public sealed class ReadOnlyPropertyGrid : System.Windows.Forms.PropertyGrid
    {
        #region Non-greyed read only support
        public ReadOnlyPropertyGrid()
        {
            this.ViewForeColor = Color.FromArgb(1, 0, 0);
        }
        //---
        private bool _readOnly;
        public bool ReadOnly
        {
            get { return _readOnly; }
            set
            {
                _readOnly = value;
                this.SetObjectAsReadOnly(this.SelectedObject, _readOnly);
            }
        }
        //---
        protected override void OnSelectedObjectsChanged(EventArgs e)
        {
            this.SetObjectAsReadOnly(this.SelectedObject, this._readOnly);
            base.OnSelectedObjectsChanged(e);
        }
        //---
        private void SetObjectAsReadOnly(object selectedObject, bool isReadOnly)
        {
            if (this.SelectedObject != null)
            {
                TypeDescriptor.AddAttributes(this.SelectedObject, new Attribute[] { new ReadOnlyAttribute(_readOnly) });
                this.Refresh();
            }
        }
        //---
        #endregion
    }
}
...