2016-10-30 2 views
2

내가 클래스를 생성하고이 같이있는 ListView에서 파생 한 경우 ... ListView의 OnDrawItem 이벤트가 디자인 타임 환경에 영향을주지 않는 이유는 무엇입니까?

class MyListView : ListView 
{ 
    public MyListView() : base() 
    { 
     DoubleBuffered = true; 
     OwnerDraw = true; 
     Cursor = Cursors.Hand; 
     Scrollable = false; 
    } 

    protected override void OnDrawItem(DrawListViewItemEventArgs e) 
    { 
     //base.OnDrawItem(e); 
    } 
} 

는 그럼 난 내 창문 양식의 디자인 뷰를 열고 새 MyListView의 객체가 단일 항목을 추가하고 링크 추가 이미지 목록에. mylistview 객체에 하나의 항목이 있음을 알 수 있습니다. 내 양식에 lv MyListView 유형의 개체에 아무런 영향을 미치지 않습니다. 다른 앱에서 앱을 실행하면 예상 한 바를 정확히 볼 수 있으며 항목이 나열되지 않습니다.

이 효과는 런타임에 디자인 타임이 아닌 이유는 무엇입니까?

enter image description here

+0

음 ... 좋아요. 코드를 새 클래스 파일에 붙여 넣은 다음 양식을 열고 도구 상자를 클릭하여 양식 위로 끌어 놓습니다. 양식에서 새 객체를 선택하고'LargeImageList'를 내 imagelist로 변경하고 항목을 편집하여 imagelist의 이미지와 함께 하나의 항목을 포함하고 'LargeIcon'의 기본'View '를 사용합니다. 그것은 디자인 타임에 항목을 잘 보여 주지만 실행하고 아무 것도 표시되지 않습니다 ... 어떻게 작동 시키려고하는지 저에게 놀라워요. –

+0

View 속성을 설정하지 않으면 커다란 오류가 발생합니다. 맞춤 설정을 할 때 많은 문제가 있습니다. 바로 지금 당신은 라벨을 그리는 것을 보았을뿐입니다. 그것은 맞춤식으로 그려지지 않았습니다.추측 : Load 이벤트를 사용하여 속성을 변경하지 마십시오. * gauche *입니다. –

+0

이 코드로 테스트 한 결과는 다음과 같습니다 :'this.View = System.Windows.Forms.View.Details; this.OwnerDraw = true; this.Columns.Add ("X"); this.Items.Add ("1"); this.Items.Add ("2");하지만 아무것도 바뀌지 않았습니다. –

답변

0

대답

ListViewDesigner 그림자 제어 Visible 또는 Enabled 재산 등의 OwnerDraw 속성입니다. 따라서 런타임에만 작동하므로 디자인 타임에 영향을주지 않습니다.

당신이 ListViewDesigner의 소스 코드를 살펴 경우,이 속성이 표시됩니다

사이드 참고 : PreFilterProperties 당신이 디자이너는이와 함께 원래의 속성을 대체 볼 수

private bool OwnerDraw 
{ 
    get { return (bool) base.ShadowProperties["OwnerDraw"]; } 
    set { base.ShadowProperties["OwnerDraw"] = value; } 
} 

과 하나 :

PropertyDescriptor oldPropertyDescriptor = (PropertyDescriptor) properties["OwnerDraw"]; 
if (oldPropertyDescriptor != null) 
{ 
    properties["OwnerDraw"] = TypeDescriptor.CreateProperty(typeof(ListViewDesigner), 
     oldPropertyDescriptor, new Attribute[0]); 
} 

따라서 어떤 것이 든 상관 없습니다. View을 사용하면 OnDrawItem에있는 것과 관계없이 기본 그림을 수행합니다. 디자인 타임에 OwnerDraw 속성을 사용하지 않기 때문입니다. 디자이너가 그것을 어둡게합니다. 이는 Enabled 또는 Visible 속성과 동일한 동작입니다.

해결 방법은 파생 된 컨트롤의 다른 Designer을 등록 할 수 있습니다, 해결 방법으로 런타임

에서 소유자 그리기를 활성화합니다.

[Designer(typeof(ControlDesigner))] 
public class MyListView : ListView 

경고 : 다음 OwnerDraw 속성은 일반 속성으로 작동이 방법 제어를위한 새로운 디자이너를 등록하여, 명심하십시오, 당신은 디자이너 동사 또는 스마트처럼 현재 ListViewDesigner 기능을 잃게됩니다 태그 (작업 목록) 창 또는 열 크기 조정 옵션. 이러한 기능이 필요한 경우 ListViewDesigner 소스 코드를 살펴보면 해당 기능을 맞춤형 디자이너에 구현할 수 있습니다.

+0

디자인 타임에 이러한 변경 사항을 다른 방식으로 표시 할 수 있습니까? –

+0

변경 사항 그리고 어떻게 예를 들면? –

+0

이유를 설명하는 'ListViewDesigner'에서 일부 코드를 추가했습니다. –

관련 문제