Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET/C#:如何在';触发';事件_C#_Class_Button_Opacity - Fatal编程技术网

.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,同时对常见组件进行自定义。