2017-02-06 15 views
1

Скажем, моя заявка имеет около 300 стандартных элементов управления в нескольких формах. Когда-нибудь выяснится, что было бы неплохо дать всем элементам управления дополнительные элементы.Продлить все элементы управления приложения поздно, но легко

Что нужно сделать? Мое мышление:

Выведите каждый тип Control от базового класса, как это:

public partial class MyButton : Button, MyInterface 
{ 
    ... 
} 

public partial class MyTextBox : TextBox, MyInterface 
{ 
    ... 
} 

public interface MyInterface 
{ 
    // Additional members 
    ... 
} 

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

private System.Windows.Forms.Button myButton; 
private System.Windows.Forms.TextBox myTextBox; 

в

private MyButton myButton; 
private MyTextBox myTextBox; 

и от

this.myButton = new System.Windows.Forms.Button(); 
this.myTextBox = new System.Windows.Forms.TextBox(); 

в

this.myButton = new MyButton(); 
this.myTextBox = new MyTextBox(); 

Мой вопрос: Есть ли более простой способ? Может быть, если возможно, заменив класс Control классом, дополнительно полученным от MyInterface? (Control.Tag недвижимость не является вариантом)

+0

Какую собственность вы пытаетесь добавить в элемент управления? – Dispersia

+0

@Dispersia: e. г. a Список Pollitzer

+0

Хорошо, но зачем вы хотите иметь эти элементы управления? Элементы управления предназначены для ввода пользователем, они не должны содержать данные. – Dispersia

ответ

2

Создание поставщиков расширителей, по-видимому, является хорошим вариантом для вас. A ToolTip - пример; когда вы добавляете форму ToolTip в форму, она добавляет свойство строки всем элементам управления.

Поставщик расширителя предоставляет свойства другим компонентам. Вы можете проектировать компоненты расширителя, чтобы добавить некоторые свойства с различными (простыми или сложными) типами к различным типам управления. Свойство, предоставляемое поставщиком расширителя, фактически находится в самом объекте поставщика расширений и, следовательно, не является истинным свойством компонента, который он модифицирует. Во время разработки свойство появляется в окне свойств. Во время выполнения вы можете вызвать методы getter и setter в компоненте extender.

Ресурсы

Пример

Здесь представляет собой действительно простой примерный компонент, который добавляет строку SomeProperty к TextBox и Button. Имущество является простым, без фактического использования, но для вас это начальная точка:

using System.Collections; 
using System.ComponentModel; 
using System.Windows.Forms; 
[ProvideProperty("SomeProperty", typeof(Control))] 
public class ControlExtender : Component, IExtenderProvider 
{ 
    private Hashtable somePropertyValues = new Hashtable(); 
    public bool CanExtend(object extendee) 
    { 
     return (extendee is TextBox || 
       extendee is Button); 
    } 
    public string GetSomeProperty(Control control) 
    { 
     if (somePropertyValues.ContainsKey(control)) 
      return (string)somePropertyValues[control]; 
     return null; 
    } 
    public void SetSomeProperty(Control control, string value) 
    { 
     if (string.IsNullOrEmpty(value)) 
      somePropertyValues.Remove(control); 
     else 
      somePropertyValues[control] = value; 
    } 
} 
+0

Reza извините, что прокомментировал здесь, но почему был ваш ответ на мой вопрос http://stackoverflow.com/q/42027926/68936 удален? Казалось, что именно я хотел, и я как раз собирался попробовать. – Jimmy

+0

Привет @Jimmy, без проблем, я его восстановил. Когда я не получил от вас никакого ответа, даже после того, как спросил: «Разве это не то, что вы ищете?», Я решил не беспокоить вас и просто удалить свой ответ, потому что я не думал, что вы не заинтересованы в ответьте, вам также не интересно отправить отзыв об этом :) –

+0

Хорошее решение, напоминает мне WPF [AttachedProperty] (https://msdn.microsoft.com/en-us/library/system.activities.presentation. model.attachedproperty (v = vs.110) .aspx); => [обзор] (https://msdn.microsoft.com/en-us/library/ms749011 (v = vs.110) .aspx) – Pollitzer

1

Я бы этого не сделал. Нормальная работа элементов управления не изменяется, только нужно сохранить дополнительную информацию? Я бы использовал глобальный словарь, в котором класс MyExtension содержит все члены, которые будут добавлены в ваш MyInterface.

1

Если вы хотите только добавить методы, вы можете просто использовать методы расширения.

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

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

  • Нет связанных вопросов^_^