Как создать элемент управления C # Winforms, который зависает - PullRequest
9 голосов
/ 09 декабря 2008

Как вы можете создать элемент управления C # Winforms, который выходит за пределы своего региона? Например, выпадающий список. Вроде как, если у вас есть DropDownBox на маленькой панели размера.

Ответы [ 3 ]

8 голосов
/ 10 декабря 2008

Windows Forms не очень хорошо поддерживает такие окна, она в принципе несовместима с дизайнером. Вот код, который поможет вам начать. Вы не можете использовать этот элемент управления в конструкторе, он должен быть создан во время выполнения. Вы также должны вызвать его метод 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;
    }
  }
}
2 голосов
/ 09 декабря 2008

Недавно я сделал что-то похожее на это и использовал ListBox. Отличная идея списка - вы можете отображать его где угодно, даже за пределами вашего контроля. Таким образом, когда вы обнаруживаете с помощью нажатия кнопки или чего-либо еще, что вам нужно отобразить DropDown, который вы хотите, просто заполните ListBox и отобразите его где угодно. Я получил идею отсюда:

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

Они показывают, как создать Custom DataGridView с фильтрацией, и для отображения значений фильтра они помещают ListBox под ячейку заголовка.

0 голосов
/ 06 июля 2012

Здесь есть хорошая статья:

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

У него есть класс, который обрабатывает некоторые хитрые аспекты правильной работы, такие как поддержание заголовка окна приложения активным, обработка Alt-Tab и отмена щелчком мыши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...