C#按钮带有图像,但在单击时不会被“按下”。

4

我正在涉猎C#,对它还比较不熟悉。我有一个带有文本和图像的按钮。当我运行程序并按下按钮时,按钮被按下,文本也被压缩,但是图像保持静态。

有人知道解决方法吗?

*编辑:

    this.btnRename.AllowDrop = true;
    this.btnRename.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                | System.Windows.Forms.AnchorStyles.Right)));
    this.btnRename.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
    this.btnRename.Image = ((System.Drawing.Image)(resources.GetObject("btnRename.Image")));
    this.btnRename.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
    this.btnRename.Location = new System.Drawing.Point(675, 3);
    this.btnRename.Margin = new System.Windows.Forms.Padding(0);
    this.btnRename.Name = "btnRename";
    this.btnRename.Size = new System.Drawing.Size(55, 48);
    this.btnRename.TabIndex = 7;
    this.btnRename.Text = "&Rename";
    this.btnRename.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
    this.btnRename.UseVisualStyleBackColor = false;
    this.btnRename.Click += new System.EventHandler(this.btnRename_Click);

2
我不确定你想做什么。你是想让图像向左或向右移动一个像素吗?如果是这样,为什么要这样做呢?试着点击一个只有文本的普通按钮,文本也会保持静态。我建议你让.NET框架和操作系统一起决定按钮应该如何呈现以及点击效果应该如何行为。这将创建在该操作系统下运行的所有应用程序的共同外观和感觉。 - Philip Daubmeier
我的意思是,当你按下按钮时,按钮和文本会缩进,就像你真的按下了按钮一样。但是这种行为在图像上不起作用。 - MarkP
编写一个按钮的点击事件函数。 - DELETE me
3
我不知道其他人在做什么,但对于我来说,当点击按钮时,文本确实会向下和向右移动 - 似乎是1像素 - 但图像保持静态。如果确实没有发生这种情况,可能是操作系统设置的问题,但我无法想象一个按钮在其中文本不会移动。KrisTrip下面的解决方案似乎很有效。 - Joe Enos
我同意OP和Enos的观点,在我的Windows按钮上,文本向右/向下移动;无论是在非.NET按钮(打开文件对话框)中还是在Forms.Button中。 - Conrad Albrecht
显示剩余2条评论
2个回答

1

.NET不会自动为您执行此操作,因为它不知道您在单击按钮时希望图像发生什么。您希望它变小、向右移动、向左移动等等。也许您可以实现MouseDown和MouseUp事件?在MouseDown上,您可以将其更改为所期望的“按下”图像,并在MouseUp上将其改回。当然,这涉及到您基本上拥有2个图像,一个是“点击”版本,另一个是“正常”版本。


这样做虽然能实现,但维护起来会非常麻烦...如果你真的想要这个功能,我建议使用图像处理器(例如:MouseDown = imageclone + 1px margin或类似的方式)。 - riffnl
我不相信这个答案;我期望的似乎很明显,就像对文本一样对图像做同样的事情:移动 r/d。我猜 .NET 没有这样做是因为他们没有费心/注意到。 - Conrad Albrecht
我想我应该说得更像是.NET "可能" 不这样做,因为......我并不声称拥有任何关于微软的内部知识。回答的重点是建议一种获得相同功能的方法。另一个选择是使用WPF而不是WinForms,它允许您执行转换。 - KrisTrip
拥有两个独立的图标会导致膨胀,所以我不太赞成。然而,WPF的想法很有趣,我会尝试实现它。 - MarkP

0

我曾经遇到过自定义图像按钮的同样问题。我的解决方法是通过重写 OnMouseDown 事件处理程序来模拟“按钮闪烁”。

protected override void OnMouseDown(EventArgs e) {
  base.OnMouseDown(e);

  var g = this.CreateGraphics();
  var brush = new SolidBrush(Color.FromArgb(128, 128, 128, 128));
  g.FillRectangle(brush, this.ClientRectangle);
  System.Threading.Thread.Sleep(50);
}

闪烁效果是通过在按钮上绘制半透明矩形来模拟的。需要使用Thread.Sleep(),否则我看不到效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接