.NET/C#:如何在';触发';事件
我只是想知道是否有一种方法可以最小化应用程序中的代码混乱 我已经编写了类似的代码:.NET/C#:如何在';触发';事件,c#,class,button,opacity,C#,Class,Button,Opacity,我只是想知道是否有一种方法可以最小化应用程序中的代码混乱 我已经编写了类似的代码: private void btnNext_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) { btnNext.Opacity = 1; } private void btnNext_MouseLeave(object sender, System.Windows.Input.Mouse
private void btnNext_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
btnNext.Opacity = 1;
}
private void btnNext_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
btnNext.Opacity = 0.5;
}
private void btnShowAll_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
btnShowAll.Opacity = 1;
}
private void btnShowAll_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
btnShowAll.Opacity = 0.5;
}
private void btnPrev_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
btnPrev.Opacity = 1;
}
private void btnPrev_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
btnPrev.Opacity = 0.5;
}
private void btnSearch_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
btnSearch.Opacity = 1;
}
private void btnSearch_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
btnSearch.Opacity = 0.5;
}
private void btnSearchStore_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
btnSearchStore.Opacity = 1;
}
private void btnSearchStore_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
btnSearchStore.Opacity = 0.5;
}
private void btnCloseSearch_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
btnCloseSearch.Opacity = 1;
}
private void btnCloseSearch_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
btnCloseSearch.Opacity = 0.5;
}
private void btnHome_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
btnHome.Opacity = 1;
}
private void btnHome_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
btnHome.Opacity = 0.5;
}
诸如此类
我是否需要创建一个最初运行的“函数”?或者我必须创建另一个类以便“组织”它们吗
有什么建议吗?您可以将所有这些函数重写为2:
private void FadeBtn_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
Button btn = (Button)sender;
btn.Opacity = 1;
}
private void FadeBtn_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
Button btn = (Button)sender;
btn.Opacity = 0.5;
}
然后将所有按钮MouseEnter和MouseLeave事件指向这些函数。创建一个Mouse Enter事件并注册所有按钮。在方法内部,您会注意到我将sender对象强制转换为按钮。所以无论按钮怎么称呼它,你都可以在上面执行这个不透明度操作
private void ButtonMouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
Button button = (Button) sender;
button.Opacity = 1;
}
据我所知,在您的情况下,您可以缩短为:
private void btn_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
(sender as Button).Opacity = 1;
}
private void btn_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
(sender as Button).Opacity = 0.5;
}
在设计器中,您可以选择这些事件处理程序,而不是为每个按钮创建新的事件处理程序。您需要使用ChangeButtonCapacity方法:
private void ChangeButtonOpacity(Button button, double newOpacity)
{
button.Opacity = newOpacity;
}
您可以将处理程序实现为:
private void btn_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
ChangeButtonOpacity((Button)sender, 1);
}
private void btn_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
ChangeButtonOpacity((Button)sender, 0.5);
}
这样,您只需要两个处理程序。如果您不将按钮的Tag属性用于其他任何操作,那么您可以使用按钮的Tag属性,然后执行以下操作
private void btn_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
(sender as Button).Opacity = (double)((sender as Button).Tag);
}
private void btn_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
(sender as Button).Opacity = 0.5;
}
这将允许您仅使用两个处理程序为不同的按钮设置不同的值。+1只要他的实现保持如此简单,就可以正常工作。例如,如果我同时创建了一个动态生成按钮的函数(比如说5个新按钮),它们会有自己的MouseEnter和MouseLeave事件吗?@eibhrum如果它们具有相同的功能,那么您可以将它们注册到这两个事件中,因为它们将执行相同的操作。尽管原始功能没有保留,但程序现在要短得多;)如果要在
NullReferenceException
上失败,为什么要将用作
?使用显式强制转换,并在发送方
不是按钮时在InvalidCastException
上正确失败。lolz由于复制和浪费,我的第一个版本是错误的,我暂时无法编辑它,因为StackOverflow今天在这里很慢,我经历了连续的超时:-/好的一点,但在走这条路的时候要小心。我在Delphi中看到它被滥用——对象被转换为存储在标记中的指针,然后在事件触发时被转换并使用。作为你自己,“一个新的开发人员(或者两年后的你自己)是否能够在修改代码时弄清楚将标签设置为什么?”这是非常正确的。我通常使用它作为快速简单应用程序的快速修复。更好的处理方法,以及我通常如何解决您所谈论的问题的方法,是继承对象并添加您自己的属性。如果需要,这仍然允许您在设计器模式下使用VS Designer,同时对常见组件进行自定义。