是否有可能以这种方式设计方法,它知道它必须在退出时自动连续调用下一个方法?
在下面的示例中,我必须调用Refresh()
以使我的表单在此事件发生后重新绘制。问题是,在例如必须使表单刷新的20个不同事件之后调用Refresh()
是很难看的。 e.g
private void PriorityLine_Click(object sender, EventArgs e)
{
_showPriorityLine = (_showPriorityLine) ? false : true;
Refresh(); // Must call refresh for changes to take effect.
}
我想我正在寻找的是某种签名,我可以应用于该方法,使其自动链接到下一个方法,无论从哪里调用。例如
(我知道这在语法上不正确。)
private void PriorityLine_Click(object sender, EventArgs e).Refresh()
{
_showPriorityLine = (_showPriorityLine) ? false : true;
}
我想从方法中包含的逻辑中分离方法的接口。我知道这将是确切的努力量,如果不是更多。例如,如果我要编辑该方法并且意外地删除了Refresh,则会导致我的应用程序中断。然而,如果Refresh方法超出了方法的实际逻辑,我可以在方法中做任何事情而不用担心删除下一个逻辑链。
答案 0 :(得分:4)
听起来你想要的是面向方面编程,有一些不同的框架可以让你在运行一些方法之后“神奇地”发生东西,看看这里AOP programming in .Net?
答案 1 :(得分:1)
我不知道任何真正干净的方式。一种方法是使用PostSharp。
答案 2 :(得分:0)
您可以封装更改,这些更改会导致表单刷新为表单级属性。
例如,
private bool _showPriorityLine;
private bool ShowPriorityLine
{
get { return _showPriorityLine; }
set
{
_showPriorityLine = value;
Refresh();
}
}
那么你的活动就是
private void PriorityLine_Click(object sender, EventArgs e)
{
ShowPriorityLine = !ShowPriorityLine;
}
当然,如果您有多个事件操纵导致表单需要刷新的相同变量,那么这只会清理您的代码。
答案 3 :(得分:0)
考虑到您的特定问题和发布的解决方案,我会说这里“最干净”的方法是在表单中实现Property Changed Notification仅供内部使用,即您不需要公开事件就像在MSDN示例中一样。
通过这种方式,您可以维护一个内部的属性列表,您知道这些属性需要刷新表单,例如
private List<string> _refreshProps = new List<string>();
private bool _showPriority;
public void Form()
{
_refreshProps.Add("ShowPriority");
... etc
}
// only implement properties like this that need some extra work done
public bool ShowPriority
{
get { return _showPriority; }
set
{
if (_showPriority != value)
{
_showPriority = value;
// Call OnPropertyChanged whenever the property is updated
OnPropertyChanged("ShowPriority");
}
}
}
// basic property that doesn't require anything extra
public bool AnotherProperty { get; set; }
public void Refresh()
{
// refresh the form
}
protected void OnPropertyChanged(string name)
{
if (_refreshProps.Contains(name))
Refresh();
}
这种方法的好处是,如果将来您需要在特定属性之后执行其他“stuff”,您可以简单地引入另一个列表并在OnPropertyChanged
方法中再次处理它。
答案 4 :(得分:0)
请勿致电Refresh
,致电Invalidate
。您需要的机制已内置到Windows中。调用Invalidate
只是说明窗口需要重新绘制。操作系统最终会发布WM_PAINT消息(通常在根DispatchMessage调用完成后,但确切的实现是无关紧要的。)
答案 5 :(得分:-1)
使用在setter中调用Refresh的属性。
答案 6 :(得分:-5)
这样的事情:
private void RefreshAfter(Action action)
{
action();
Refresh();
}
更新以使其更加显着:
private void DoSomeUiShiznit(Action action)
{
action();
// other parts of the code don't realize that Refresh has to be called.
// But that's cool. I got it covered.
Refresh();
}
private void PriorityLine_Click(object sender, EventArgs e)
{
DoSomeUiShiznit(() => { _showPriorityLine = !_showPriorityLine; });
}
更新 - 向下选民发送消息:
你们中有些人太盲目无法看到,这与以下内容并无不同:
[SomeRefreshAttribute]
private void PriorityLine_Click(object sender, EventArgs e)
{
_showPriorityLine = !_showPriorityLine;
}
除了它更简单,并且不需要在解决方案中添加另一个框架。然而另一个答案表明,不要再投票了!
你们有什么问题?