Могу ли я использовать несколько копий элемента управления Windows Forms?

1

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

Есть ли способ использовать несколько копий одного и того же элемента управления Windows Forms?

  • 1
    Нет, просто подумайте, у каждого лейбла есть своя позиция. Если три метки имеют одинаковые свойства, как вы по-разному позиционируете их в форме? Они являются instances одного и того же класса Label, и у каждого есть своя жизнь со своими свойствами, уникальными для каждого.
  • 1
    Если вы хотите упростить манипулирование несколькими элементами управления, вы можете вставить подобные элементы в коллекцию, а затем применить изменения ко всему списку, чтобы они были точными. Другой подход заключается в том, что вы программно генерируете первый элемент управления, а затем можете скопировать объект в нужные места.
Теги:
winforms

4 ответа

1
Лучший ответ

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

Мы делаем класс, скажем, LabelTextResourced

public class LabelTextResourced: Label
{
    private string _textResourceName;
    public string TextResourceName
    {
        get { return _textResourceName; }
        set
        {
            _textResourceName = value;
            if (!string.IsNullOrEmpty(_textResourceName))
                base.Text = Properties.Resources.ResourceManager.GetString(_textResourceName);
        }
    }

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public override string Text
    {
        get { return base.Text; }
        set
        {
            // Set is done by resource name.
        }
    }
}

Создайте свой проект, теперь вы можете добавить LabelTextResourced управления LabelTextResourced для своего дизайнера.

Щелкните правой кнопкой мыши свой проект и перейдите к свойствам и выберите вкладку ресурсов. добавьте ресурс, например: {Name: "LabelText", Value: "Hiiiiii!!!"}

Теперь вернитесь в конструкторе форм, выберите экземпляр LabelTextResourced и установить его TextResourceName свойства LabelText.

Постройте снова, и теперь вы должны увидеть, что ваш текст ярлыка задан из ресурса. Теперь у вас может быть много ярлыков, что их текст задан из одного места и LabelText ресурс LabelText (и сборку) на изменение всех LabelTextResourced управления LabelTextResourced, у которых LabelText является их TextResourceName.

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

  • 1
    +1 за креативный ответ. У меня есть один вопрос: как бы вы обновили это во время выполнения ...?
  • 0
    это совершенно новый вопрос, вы можете редактировать файлы ресурсов во время выполнения, но изменения не будут отражаться в ваших элементах управления, я думаю, что предоставление метода, который снова получит значения из файла ресурсов, решит проблему @ Ric.Net
1

Как предположил @nim, вы можете создать свойство mapper. Конечно, во время дизайна все может выглядеть уродливо. Например:

public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();

        PropertyMapper.Map(txtBox1, textBox2, 
            new[] { "width", "font", "forecolor", "backcolor", "text" });
    }
}

public static class PropertyMapper
{
    public static void Map(Control source, Control target, params string[] properties)
    {
        properties = properties.Select(p => p.ToLowerInvariant()).ToArray();

        foreach (var prop in source.GetType().GetProperties()
            .Where(p => properties.Contains(p.Name.ToLowerInvariant()))
                .Where(prop => prop.CanWrite))
        {
            prop.SetValue(target, prop.GetValue(source));
        }
    }
}


Изображение 174551
  • 0
    и каково решение во время разработки?
  • 0
    Ну, не этот.
1

Вы можете установить один из экземпляров элемента управления как "шаблон" и скопировать все необходимые свойства в другие экземпляры (разумеется, оставить их в покое).

1

Вы можете добавить статический метод в свой код формы:

private static void SetTextToLabels(string text, params Label[] labels)
{
    foreach (var label in labels)
    {
        label.Text = text;
     }
}

// Use like this
private void UpdateTextInLabels()
{
    SetTextToLabels("SomeText", label1, label2, label3);
}

Или, если все метки находятся в одном контейнере (форма, панель и т.д.), И все метки в этом контейнере должны отображать то же самое, вы могли бы написать метод расширения в элементе управления контейнера.

public static class ControlExtensions
{    
    public static void SetTextOnMyLabels(this Control control, string text)
    {
        foreach (var label in control.Controls.OfType<Label>())
        {
             label.Text = text;
         }
     }
}

// Use like this in your form
private void UpdateTextInLabels()
{
    //Update all labels in panel1
    panel1.SetTextOnMyLabels("SomeText");
}
  • 0
    каково ваше решение во время разработки?
  • 0
    во время разработки мое решение простое: удерживайте кнопку управления, выберите все метки, которые вы хотите редактировать, и измените их свойства в окне свойств. VS достаточно умен, даже с различными элементами управления в вашем выборе, чтобы показать только те свойства, которые являются общими

Ещё вопросы

Сообщество Overcoder
Наверх
Меню