如何创建悬停的 C# Winforms 控件

Posted

技术标签:

【中文标题】如何创建悬停的 C# Winforms 控件【英文标题】:How to create a C# Winforms Control that hovers 【发布时间】:2010-09-26 02:19:29 【问题描述】:

如何创建超出其区域范围的 C# Winforms 控件?比如下拉框。有点像如果您在小型面板中有一个 DropDownBox。

【问题讨论】:

【参考方案1】:

Windows 窗体不能很好地支持这样的窗口,它与设计器根本不兼容。这里有一些代码可以帮助您入门。您不能在设计器中使用此控件,它必须在运行时创建。您还必须自己调用它的 Dispose() 方法。

using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;

public class MyListBox : ListBox 
  private Control mParent;
  private Point mPos;
  private bool mInitialized;

  public MyListBox(Control parent) 
    mParent = parent;
    mInitialized = true;
    this.SetTopLevel(true);
    parent.LocationChanged += new EventHandler(parent_LocationChanged);
    mPos = mParent.Location;
  

  public new Point Location 
    get  return mParent.PointToClient(this.Location); 
    set  
      Point zero = mParent.PointToScreen(Point.Empty);
      base.Location = new Point(zero.X + value.X, zero.Y + value.Y);
    
  

  protected override Size DefaultSize 
    get 
      return mInitialized ? base.DefaultSize : Size.Empty;
    
  

  protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) 
    if (this.mInitialized)
      base.SetBoundsCore(x, y, width, height, specified);
  

  void parent_LocationChanged(object sender, EventArgs e) 
    base.Location = new Point(base.Left + mParent.Left - mPos.X, base.Top + mParent.Top - mPos.Y);
    mPos = mParent.Location;
  

  protected override CreateParams CreateParams 
    get 
      CreateParams cp = base.CreateParams;
      if (mParent != null && !DesignMode) 
        cp.Style = (int)(((long)cp.Style & 0xffff) | 0x90200000);
        cp.Parent = mParent.Handle;
        Point pos = mParent.PointToScreen(Point.Empty);
        cp.X = pos.X;
        cp.Y = pos.Y;
        cp.Width = base.DefaultSize.Width;
        cp.Height = base.DefaultSize.Height;
      
      return cp;
    
  

【讨论】:

试过了,效果很好,但不知何故,它不会引发像 DrawItem 和 SelectedIndexChanged 这样的 ListBox 事件。你知道为什么吗? 在这里查看我的回复:***.com/questions/398176/…【参考方案2】:

我最近做了类似的事情,我使用了一个 ListBox。对列表框的一个很酷的想法是,您可以在任何您想要的地方显示它,甚至超出您的控制范围。这样,当您通过按钮单击或其他方式检测到您需要显示所需的 DropDown 时,只需填充 ListBox 并将其显示在您想要的任何位置。我从这里得到了这个想法:

http://msdn.microsoft.com/en-us/library/aa480727.aspx

他们展示了如何构建一个带有过滤功能的自定义 DataGridView,为了显示过滤器值,他们在标题单元格下放置了一个 ListBox。

【讨论】:

【参考方案3】:

这里有一篇好文章:

http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/article.asp

它有一个类来处理使它正常工作的一些棘手方面,例如保持应用程序窗口标题栏处于活动状态、处理 Alt-Tab 和通过鼠标单击取消。

【讨论】:

以上是关于如何创建悬停的 C# Winforms 控件的主要内容,如果未能解决你的问题,请参考以下文章

WinForms:使用 c# 添加控件

C# WebBrowser CSS 悬停样式不起作用(尽管配置了浏览器仿真)

如何在 C# Winforms 的下拉列表控件中获取数据源名称

C# WinForms 用鼠标拖动控件

如何在更新数据源时让绑定的 winforms 控件刷新?

当鼠标悬停在控件的指定区域时如何更改鼠标光标?使用 c#