Я новичок в C#, но я опытный разработчик Delphi. В Delphi я могу использовать один и тот же код для MenuItem и ToolButton, используя событие TAction.OnExecute, и я могу отключить / включить MenuItem и ToolButton вместе, используя событие TAction.OnUpdate. Есть ли аналогичный способ сделать это в C# без использования внешних библиотек? Или более того - как разработчики C# делятся кодом между различными элементами управления?
Ладно, может я неправильно пишу свой вопрос. Я хочу знать, что использовать свойство ведьмы не нужно (я знаю о свойстве Enabled), но я хочу знать о событии ведьмы, к которому я должен присоединиться, если я хочу включить / отключить более одного элемента управления. В delphi событие TAction.OnUpdate возникает, когда приложение простаивает - есть ли подобное событие в C#?





Вы можете включить или отключить элемент управления и всех его дочерних элементов, установив его Включено свойство.
Вы можете подключить код для MenuItem и ToolButton в одном обработчике. Например:
menuItem.Click + = HandleClick;
toolbarButton.Click + = handleClick;
Таким образом, щелчок по MenuItem и Button выполнит один и тот же код и предоставит одинаковые функциональные возможности.
Попробуйте изменить шаблон команды:
public abstract class ToolStripItemCommand
{
private bool enabled = true;
private bool visible = true;
private readonly List<ToolStripItem> controls;
protected ToolStripItemCommand()
{
controls = new List<ToolStripItem>();
}
public void RegisterControl(ToolStripItem item, string eventName)
{
item.Click += delegate { Execute(); };
controls.Add(item);
}
public bool Enabled
{
get { return enabled; }
set
{
enabled = value;
foreach (ToolStripItem item in controls)
item.Enabled = value;
}
}
public bool Visible
{
get { return visible; }
set
{
visible = value;
foreach (ToolStripItem item in controls)
item.Visible = value;
}
}
protected abstract void Execute();
}
Ваши реализации этой команды могут быть с отслеживанием состояния, чтобы поддерживать состояние вашего представления. Это также дает возможность встроить в вашу форму «отмену». Вот код игрушки, который использует это:
private ToolStripItemCommand fooCommand;
private void wireUpCommands()
{
fooCommand = new HelloWorldCommand();
fooCommand.RegisterControl(fooToolStripMenuItem, "Click");
fooCommand.RegisterControl(fooToolStripButton, "Click");
}
private void toggleEnabledClicked(object sender, EventArgs e)
{
fooCommand.Enabled = !fooCommand.Enabled;
}
private void toggleVisibleClicked(object sender, EventArgs e)
{
fooCommand.Visible = !fooCommand.Visible;
}
HelloWorldCommand:
public class HelloWorldCommand : ToolStripItemCommand
{
#region Overrides of ControlCommand
protected override void Execute()
{
MessageBox.Show("Hello World");
}
#endregion
}
К сожалению, Control и ToolStripItem не имеют общего интерфейса, поскольку оба они имеют свойства «Enabled» и «Visible». Чтобы поддерживать оба типа, вам придется составить команду для обоих или использовать отражение. Оба решения нарушают элегантность, обеспечиваемую простым наследованием.
Вы никогда не используете параметр eventName в методе RegisterControl. Это предназначено?
@Xline, пожалуйста, не спрашивайте случайных людей в area51 вот так - это нецелесообразно использовать комментарии