【问题标题】:Creating an image button in .NET Winforms application在 .NET Winforms 应用程序中创建图像按钮
【发布时间】:2011-06-15 07:48:35
【问题描述】:

我正在尝试在 Visual Studio 2010 的 .NET 4.0 Winforms 应用程序中创建一个按钮,该按钮只是一个图像。我有一个无边框的窗口,并且有一个背景图像,该图像构成了此应用程序的自定义皮肤。对于窗口右上角的关闭/最小化按钮,我想创建 2 个简单的按钮,它们只是看起来像典型的 Windows 关闭/最小化按钮的图像。

我的这个设计可能有误,如果我错了,请告诉我。到目前为止,我已经确定我需要为仅呈现图像的 Button 创建一个子类。最终实现需要为每个按钮状态(正常、悬停、单击等)渲染不同的图像。这是我目前所拥有的:

public class ImageButton : Button
{
    Pen pen = new Pen( Color.Red, 1.0f );

    public ImageButton()
    {
        SetClientSizeCore( BackgroundImage.Width, BackgroundImage.Height );
    }

    protected override void OnPaint( PaintEventArgs e )
    {
        e.Graphics.DrawImage( BackgroundImage, 0, 0 );
        //e.Graphics.DrawRectangle( pen, ClientRectangle );
        //Rectangle bounds = new Rectangle( 0, 0, Width, Height );
        //ButtonRenderer.DrawButton( e.Graphics, bounds, PushButtonState.Normal );
        //base.OnPaint(pevent);
    }

    protected override void OnPaintBackground( PaintEventArgs e )
    {
        // Do nothing
    }
}

此时,假设这个设计是合适的,我需要知道如何恰当地调用 SetClientSizeCore()。在构造函数中调用它会引发异常。我认为这是因为控件还没有机会初始化。我不确定要覆盖哪个函数,它可以让我在.NET 初始化后更改按钮的大小以适应图像。对此有何想法?

【问题讨论】:

  • 我自己也尝试过,但意识到一个更简单的解决方法是使用 PictureBox 控件,因为它有一个点击事件,而且我不需要其他任何东西,特别是按钮对象.

标签: c# .net winforms button


【解决方案1】:

在构造函数中,BackgroundImagenull

BackgroundImage被重写时,你需要设置大小。

您还应该隐藏Size 属性并添加[DesignerSerializationVisibilty(DesignerSerializationVisibility.Hidden)] 以防止设计器保存大小。

【讨论】:

  • 尤其是 DesignerSerializationVisibility 元素...我相信很多人都错过了那部分。
  • 当您说“遮蔽” Size 属性时,您的意思是重新实现它并将 get/set 转发到 base.Size?它不是虚拟的,所以我不能使用与 BackgroundImage 相同的方式覆盖它。
  • @Bob:是的,使用 new 修饰符。
  • 非常有用。顺便说一句,设计师属性的错字;应该是:[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  • @SLaks 我只是想提请注意,这篇文章中仍然存在拼写错误。应该是[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]。请注意在Visibility 的第一次出现中添加了最后一个i(更改的字符不够我自己编辑)。
【解决方案2】:

等到分配了 BackgroundImage 属性后,您就会知道所需的大小。像这样覆盖属性:

public override Image BackgroundImage {
    get { return base.BackgroundImage; }
    set {
        base.BackgroundImage = value;
        if (value != null) this.Size = value.Size;
    }
}

【讨论】:

    【解决方案3】:

    如果你想使用ImageButtons,我推荐使用 BunifuUI,因为它有ImageButtons

    如果你不想使用 BunifuUI,你可以使用 PictureBox,因为它也有一个点击事件。示例:

    private void pictureBox1_Click(object Sender, EventArgs e) {
       webBrowser1.Navigate("https://www.google.com");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 2011-03-06
      • 1970-01-01
      相关资源
      最近更新 更多