【问题标题】:Change focus color when button clicked单击按钮时更改焦点颜色
【发布时间】:2015-10-27 08:25:13
【问题描述】:

我的系统上的按钮很少,我尝试在单击按钮时更改颜色焦点。到目前为止,我的编码只能在单击时更改按钮颜色,但我希望我的系统能够在单击其他按钮时将按钮颜色重置为正常颜色。

我试图在网站上找到解决方案,但我真的不明白怎么做,因为他们的示例对我来说太复杂了。

这是我更改按钮颜色焦点的简单代码。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.Button1.BackColor = Color.Gainsboro
    Me.Button1.ForeColor = Color.Black
End Sub

请帮助我。谢谢。

【问题讨论】:

  • 您可以存储原始颜色(例如,在全局变量中,如origBackColor & origForeColor; 并在主窗体的Load 事件中分配值)并在以下情况下使用它们必需的。例如:在Button2Click事件中,您可以将新颜色分配给Button2,将原始颜色分配给Button1。希望这会有所帮助,因为这个问题在这里似乎很离题(太抽象而且关于太基本的概念)。
  • 如果使用 Windows 窗体应用程序,我以前从未这样做过,所以我仍然认为这是新手。顺便谢谢你的回复。我会试试的:)
  • 你必须明白 SO 不是学习的地方(即,你的问题要么得不到回答,要么被否决/删除);另外询问每一位不是最好的程序。有很多可靠的示例代码,.NET 文档(msdn.microsoft.com/en-us/library/2x7h1hfk.aspx)非常好;这与您自己的一些工作一起应该是一个很好的学习过程。或者,您可能会参加一门课程或类似的课程。 SO 适用于知识渊博的人,可以询问在其他地方无法轻易找到的问题。
  • @Emerald 如果您对answer有任何疑问,请告诉我

标签: vb.net winforms


【解决方案1】:

由于用户无需点击即可专注于按钮,因此最好处理按钮的GotFocusLostFocus 事件并将您的逻辑放在那里。

在下面的代码中,我为表单中的所有按钮分配了一个处理程序,并将原始ForeColorBackColor 存储在Tag 属性的数据结构中。然后在GotFocus 中,我将ForeColorBackColor 设置为所需的focusedForeColorfocusedBackColor。同样在LostFocus 中,我恢复了之前存储在Tag 中的原始前景色和背景色。

将此代码粘贴到您的表单代码中就足够了,它将适用于所有按钮:

'Change these to your desired color
Private focusedForeColor As Color = Color.Black
Private focusedBackColor As Color = Color.Gainsboro

Private Function GetAllControls(control As Control) As IEnumerable(Of Control)
    Dim controls = control.Controls.Cast(Of Control)()
    Return controls.SelectMany(Function(ctrl) GetAllControls(ctrl)).Concat(controls)
End Function

Public Sub New()
    InitializeComponent()
    Me.GetAllControls(Me).OfType(Of Button)().ToList() _
      .ForEach(Sub(b)
                   b.Tag = Tuple.Create(b.ForeColor, b.BackColor)
                   AddHandler b.GotFocus, AddressOf b_GotFocus
                   AddHandler b.LostFocus, AddressOf b_LostFocus
               End Sub)
End Sub

Private Sub b_LostFocus(sender As Object, e As EventArgs)
    Dim b = DirectCast(sender, Button)
    Dim colors = DirectCast(b.Tag, Tuple(Of Color, Color))
    b.ForeColor = colors.Item1
    b.BackColor = colors.Item2
End Sub

Private Sub b_GotFocus(sender As Object, e As EventArgs)
    Dim b = DirectCast(sender, Button)
    b.ForeColor = focusedForeColor
    b.BackColor = focusedBackColor
End Sub

【讨论】:

  • 就像你说的。一切正常。非常感谢:)
【解决方案2】:

在声明部分创建 2 个颜色变量,一个用于背景属性,另一个用于前景色属性。您必须在表单的事件加载中将 Button1 的背景颜色和前景颜色属性分配给这些变量。当您单击 Button1 时,它会随着您所做的代码而改变,当您单击另一个按钮时,它会通过使用颜色变量恢复 Button1 的颜色。我希望这个解释对你有所帮助。下面是完整的代码以供进一步说明。

公开课表1 Dim bgColor, foColor As Color

Private Sub Button1_Click(sender As Object, e As EventArgs) _
    Handles Button1.Click
    Button1.BackColor = Color.Yellow
    Button1.ForeColor = Color.Blue
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) _
    Handles Button2.Click
    Button1.BackColor = bgColor
    Button1.ForeColor = foColor
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) _
    Handles MyBase.Load
    bgColor = Button1.BackColor
    foColor = Button1.ForeColor
End Sub

结束类

【讨论】:

  • 你的也不错。我也试过了,它工作正常。我会为你投票。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 2021-07-07
  • 2012-12-06
  • 1970-01-01
  • 2018-07-20
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多