2016-10-30 3 views
2

Если я создать класс и сделать его производным от ListView, как это ...Почему событие OnDrawItem для ListView не влияет на среду разработки?

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, и он использует стандартный' View' 'LargeIcon'. Он показывает, что элемент отлично подходит во время разработки, но запускает его, и ничего не отображается ... Как вы его работаете, это потрясающе для меня. –

+0

Не задавать свойство «Вид» - довольно большая ошибка, имеет значение, когда вы производите розыгрыш. Прямо сейчас вы просто видите, что он нарисовал ярлык, это не набросок.Guessing: не используйте событие Load для изменения свойств, это * gauche *. –

+0

Я также тестировал этот код: 'this.View = System.Windows.Forms.View.Details; this.OwnerDraw = true; this.Columns.Add ("Х"); this.Items.Add ("1"); this.Items.Add ("2"); 'Но ничего не изменилось. –

ответ

0

Ответ

ListViewDesigner тени OwnerDraw собственности как Visible или Enabled свойство контроля. Таким образом, он просто работает во время выполнения, и его изменение не влияет на время разработки.

Side Примечание

Если вы посмотрите на исходный код ListViewDesigner, вы увидите следующее свойство:

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

И PreFilterProperties вы увидите дизайнер заменил оригинальное свойство с этим один:

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

Не имеет значения, что такое View, вы выполняете по умолчанию, независимо от того, что у вас есть в OnDrawItem. Это потому, что он не использует свойство OwnerDraw во время разработки. Дизайнер затеняет его. Это то же поведение, что и для Enabled или Visible.

Временного решения для того, чтобы владелец-дро во время выполнения

В качестве обходного пути, вы можете зарегистрировать другие Designer для производного контроля. Таким образом OwnerDraw свойство будет работать как обычные собственности:

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

Внимание: Имейте в виде, при регистрации нового дизайнера для управления, вы потеряете текущие ListViewDesigner функций, такие как дизайнерские глаголы или его смарт тег (список действий) или параметры размера столбца. Если вам нужны эти функции, вы можете реализовать эти функции в пользовательском дизайнере, изучив исходный код ListViewDesigner.

+0

Можно ли показать эти изменения во время разработки по-другому? –

+0

Какие изменения? А как например? –

+0

Я добавил некоторые коды из «ListViewDesigner», которые, как мне кажется, описывают причину. –

Смежные вопросы