Скажем, если бы я использовал ярлык, который я хочу использовать в нескольких (например, трех) местах в форме. Я мог бы использовать три разных ярлыка, но было бы намного проще, если бы я мог использовать копии одной метки. Этот последний подход позволил бы мне изменить свойства, связанные с ярлыками в одном месте, в то время как с прежним подходом я должен был бы перейти к каждой из трех ярлыков, чтобы изменить их свойства. Надеюсь, мой вопрос ясен.
Есть ли способ использовать несколько копий одного и того же элемента управления Windows Forms?
Например, вы хотите иметь метки, чтобы их текст был таким же в вашем дизайнере.
Мы делаем класс, скажем, 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
.
Это только отправная точка, вы можете настроить этот класс и любые другие свойства, которые вы хотите с определенными усилиями.
Как предположил @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));
}
}
}
Вы можете установить один из экземпляров элемента управления как "шаблон" и скопировать все необходимые свойства в другие экземпляры (разумеется, оставить их в покое).
Вы можете добавить статический метод в свой код формы:
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");
}
instances
одного и того же класса Label, и у каждого есть своя жизнь со своими свойствами, уникальными для каждого.