Этот код выглядит довольно однообразно. Любой способ, чтобы сократить его?


У меня что-то вроде этого в моей программе:

    private void tspBrush_Click(object sender, EventArgs e)
    {
        currentTool = new Brush(tileLayers);

        UncheckToolstripButtons();

        tspBrush.Checked = true;
    }

    private void tspBucket_Click(object sender, EventArgs e)
    {
        currentTool = new Bucket(tileLayers);

        UncheckToolstripButtons();

        tspBucket.Checked = true;
    }

    private void tspCut_Click(object sender, EventArgs e)
    {
        currentTool = new Cut(tileLayers);

        UncheckToolstripButtons();

        tspCut.Checked = true;
    }

Как мне увеличить количество инструментов в этом списке будет только больше. Можно что-нибудь сделать, чтобы сократить его?



1246
5
c#
задан 7 августа 2011 в 04:08 Источник Поделиться
Комментарии
6 ответов

одним из способов укорочения может быть:


  • имея хеш, состоящий из пары объектов (отправителя) и инструменты. Таким образом, вы могли бы искать соответствующий инструмент для каждого отправителя в один единственный способ такой:

    HashMap<object, Tool> hashMap = new HashMap<object, Tool>( );

    hashMap.put(sender1, new Brush(tileLayers));

    // ...add the rest of the Tools
    private void clickHandler(object sender, EventArgs e)
    {
    currentTool = hashMap.get(sender);

    UncheckToolstripButtons( );
    tspBrush.Checked = true;
    }


  • Если tspXxxx не может быть получен от отправителя напрямую, используйте другую карту хеширования на карте отправителей tspXxxx объектов.

11
ответ дан 7 августа 2011 в 05:08 Источник Поделиться

Я звоню в обычный инструмент товар "" но я уверена, что у вас есть другое название...

private void tspBrush_Click(object sender, EventArgs e)
{
setTool(tspBrush);
}

private void tspBucket_Click(object sender, EventArgs e)
{
setTool(tspBucket);
}

private void tspCut_Click(object sender, EventArgs e)
{
setTool(tspCut);
}

private void setTool(Tool tool)
{
currentTool = new Brush(tileLayers);

UncheckToolstripButtons();

tool.Checked = true;
}

1
ответ дан 7 августа 2011 в 04:08 Источник Поделиться

Ошибки, извиниться в псевдо-код, пожалуйста, - у меня нет компилятора C# на этой машине.
Если это возможно, чтобы сделать интерфейс "триггерной", что tspCut, tspBrush, tspBucket и своих будущих братьев и сестер надо слушаться, вы могли бы использовать фабрику.

private void tspCut_Click(object sender, EventArgs e)  
{
createTool( Click.GetType(), tspCut );
}

private void createTool( ToolType tt, Checkable tsp )
{
currentTool = ToolFactory.create( tt );
UncheckToolstripButtons( );
tsp.Checked = true;
}

1
ответ дан 7 августа 2011 в 05:08 Источник Поделиться

Трудно сказать что-то определенного, потому что много информации отсутствует.
Но вот мой подход:
1. Создать тип инструмента:

    private enum ToolType
{
Brush,
Bucket,
Cut
}

2. Создать внутренний вспомогательный класс:

    // Inner class that represents a tool in this particular form (control, page)
private class UITool
{
public MyToolType Type { get; set; }
public Tool Tool { get; set; } //'Tool' is the parent of Brush, Bucket, Cut
public CheckBox ToolCheckBox { get; set; } //'CheckBox' a base class for tspBrush, tspBucket, tspCut

/*If tspBrush, tspBucket, tspCut don't belong to the same base class with Checked property,
then don't use ToolCheckBox property and use SetToolCollback instead.
public Action SetToolCollback { get; set; } */
}

3. Создайте частная собственность

private List<UITool> _uiTools = new List<UITool>();

4. Где-то инит это

         _uiTools.Add(new UITool()
{
Type = ToolType.Brush,
Tool = new Brush(tileLayers),
ToolCheckBox = tspBrush
});

или если вы используете SetToolCollback собственность:

            _uiTools.Add(new UITool()
{
Type = ToolType.Brush,
Tool = new Brush(tileLayers),
SetToolCollback = () => tspBrush.Checked = true
});

5. Метод create:

    private void SelectTool(ToolType toolType)
{
var utTool = _uiTools.Select(i => i.Type == toolType).Single();
currentTool = utTool.Tool;
UncheckToolstripButtons();
utTool.ToolCheckBox.Checked = true;
//If using SetToolCollback
//utTool.SetToolCollback();
}

6. Использовать этот метод:

private void tspBrush_Click(object sender, EventArgs e)
{
SelectTool(ToolType.Brush);
}

Как вариант, вы можете заменить ToolType с типом 'отправитель' и использовать общий обработчик события для всех инструментов, таких как Ян болтовых предложили.

1
ответ дан 7 августа 2011 в 06:08 Источник Поделиться

Яна ответить преобразованы в C# (если tspBrush является toolstripmenuitem в):

    Dictionary<ToolStripMenuItem, Tool> tools = new Dictionary<ToolStripMenuItem, Tool>();

// for each tool:
tools.Add(tspBrush, new Brush(tileLayers));
tspBrush.Click += toolMenuItem_Click;

private void toolMenuItem_Click(object sender, EventArgs e)
{
var menuItem = (ToolStripMenuItem)sender;

currentTool = tools[menuItem];
UncheckToolstripButtons();
menuItem.Checked = true;
}

0
ответ дан 8 августа 2011 в 12:08 Источник Поделиться

Более привлекательным решением имхо будет связать свой инструмент элементы с самих кнопок, используя тег собственность. Таким образом, вы могли бы иметь один обработчик события click для всех кнопок инструмента. Помните, что отправитель , который передается в обработчик-это контроль, который инициировал событие, поэтому вам не нужно подключить его к конкретному контроль, но более общими, чтобы использоваться для всех элементов управления. Кроме того, используя ленивый оборачивать свои средства, чтобы убедиться, что вы создать только один экземпляр их только тогда, когда вам это нужно (если и когда вам это нужно). Это может пройти гладко, если все ваши инструменты реализован определенный интерфейс или производный от того же класса.

// associating the buttons
tspBrush.Tag = new Lazy<ITool>(() => new Brush(tileLayers));
tspBucket.Tag = new Lazy<ITool>(() => new Bucket(tileLayers));
tspCut.Tag = new Lazy<ITool>(() => new Cut(tileLayers));

// THE click handler
private void ToolButton_Click(object sender, EventArgs e)
{
var button = sender as ToolStripButton;
if (button == null) return;
var lazy = button.Tag as Lazy<ITool>;
if (lazy == null) return;

currentTool = lazy.Value;
UncheckToolstripButtons();
button.Checked = true;
}

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

// associating the buttons
tspBrush.Tag = new Func<ITool>(() => new Brush(tileLayers));
tspBucket.Tag = new Func<ITool>(() => new Bucket(tileLayers));
tspCut.Tag = new Func<ITool>(() => new Cut(tileLayers));

// THE click handler
private void ToolButton_Click(object sender, EventArgs e)
{
var button = sender as ToolStripButton;
if (button == null) return;
var factory = button.Tag as Func<ITool>;
if (factory == null) return;

currentTool = factory();
UncheckToolstripButtons();
button.Checked = true;
}

Однако, если вам нужно идти по этому пути, я бы предложил добавить методы, а не обновление средств.

0
ответ дан 8 августа 2011 в 08:08 Источник Поделиться