2010-08-06 8 views
1

WinForms 속성 표를 사용하여 개체의 속성을 표시하고 있습니다. 그러나 대부분의 속성은 읽기 전용이므로 회색이 아닌 회색으로 표시됩니다. 사용되는 색상을 사용자 정의하는 방법이 있습니까? 장애가있는 속성을 읽기 쉽도록하고 싶습니다.propertygrid에서 읽기 전용 속성의 전경색 변경

BTW : this question에 대한 대답은 내가하려는 일과 관련이 있다고 생각합니다. 하지만 정확히 내가 어떻게 ControlPaint.DrawStringDisabled에 액세스 할 수 있는지 잘 모르겠습니다.

답변

1

불행히도 색상을 변경할 수있는 기본 제공 방법이 없습니다. 표준 .NET 컨트롤과 마찬가지로 COM은 단순히 COM 패키지의 래핑 된 버전 일뿐입니다.

실제 의미에서, 그림의 전부는 아니지만 COM 구성 요소에 의해 완료된 것이므로 .NET OnPaint 메서드를 재정의하고 ControlPaint.DrawStringDisabled 또는 다른 그림 코드를 호출하면 더 많은 작업이 수행됩니다 바람직하지 않은 효과가 있거나 효과가 전혀 없습니다.

귀하의 옵션은 다음과 같습니다

  1. 빌드 (아마 가장 쉬운) 처음부터 사용자 지정 컨트롤
  2. 재정 WndProc 및 페인트 (하지 작동 보장) 메시지 OnPaint를 오버라이드 (override)하는
  3. 시도를 차단하려고 위에 그림을 찍으십시오 (일을 보장하지 않습니다)

미안하지만 아마도 당신이 원한 대답은 아니지만 생각할 수는 없습니다. 쉬운 방법. 나는 이런 종류의 일이 수정하기가 어려울 수 있다는 쓴 경험을 알고 있습니다.

11

이 문제는 간단한 해결책이 있습니다.

그냥이처럼 PropertyGrid가의 forcolor의 RGB에서 R을 줄일 :

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

이 기능은 검은 색에 역할을합니다.

+0

+1. 이 작품! – Ben

+2

대체 어떻게 작동합니까? 그것은 hackish이지만, 원하는 결과를 주었다. 이것이 실패하고 어떻게 될 것인가? –

0

어떤 마술은 무엇입니까? +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 
    } 
}