我有了一个文本框和一个列表框一个用户控件,并使用它们来提供自动填充功能给用户。
不过,我想列表框的用户控件的边界之外绘制,这样它不会截断时列表已接近用户控制的边缘绘制。 如何做任何提示吗? 基本上我想有一个列表框浮动的容器控件的边界之外。
我能想到的唯一方法是将引用传递到外部列表框上实例化的用户控制和然后操纵,而不必在用户控制在其内部该列表框,但我不喜欢这种方法。 提前致谢。
我有了一个文本框和一个列表框一个用户控件,并使用它们来提供自动填充功能给用户。
不过,我想列表框的用户控件的边界之外绘制,这样它不会截断时列表已接近用户控制的边缘绘制。 如何做任何提示吗? 基本上我想有一个列表框浮动的容器控件的边界之外。
我能想到的唯一方法是将引用传递到外部列表框上实例化的用户控制和然后操纵,而不必在用户控制在其内部该列表框,但我不喜欢这种方法。 提前致谢。
问题是,你无法逃脱你的容器形式界限,但你可以在其他地方托管您的控制。
下面是我通过滥用ToolstripDropDown类(我用它在大型企业应用程序中显示datepickers)工作内容:
/// <summary>
/// PopupHelper
/// </summary>
public sealed class PopupHelper : IDisposable
{
private readonly Control m_control;
private readonly ToolStripDropDown m_tsdd;
private readonly Panel m_hostPanel; // workarround - some controls don't display correctly if they are hosted directly in ToolStripControlHost
public PopupHelper(Control pControl)
{
m_hostPanel = new Panel();
m_hostPanel.Padding = Padding.Empty;
m_hostPanel.Margin = Padding.Empty;
m_hostPanel.TabStop = false;
m_hostPanel.BorderStyle = BorderStyle.None;
m_hostPanel.BackColor = Color.Transparent;
m_tsdd = new ToolStripDropDown();
m_tsdd.CausesValidation = false;
m_tsdd.Padding = Padding.Empty;
m_tsdd.Margin = Padding.Empty;
m_tsdd.Opacity = 0.9;
m_control = pControl;
m_control.CausesValidation = false;
m_control.Resize += MControlResize;
m_hostPanel.Controls.Add(m_control);
m_tsdd.Padding = Padding.Empty;
m_tsdd.Margin = Padding.Empty;
m_tsdd.MinimumSize = m_tsdd.MaximumSize = m_tsdd.Size = pControl.Size;
m_tsdd.Items.Add(new ToolStripControlHost(m_hostPanel));
}
private void ResizeWindow()
{
m_tsdd.MinimumSize = m_tsdd.MaximumSize = m_tsdd.Size = m_control.Size;
m_hostPanel.MinimumSize = m_hostPanel.MaximumSize = m_hostPanel.Size = m_control.Size;
}
private void MControlResize(object sender, EventArgs e)
{
ResizeWindow();
}
/// <summary>
/// Display the popup and keep the focus
/// </summary>
/// <param name="pParentControl"></param>
public void Show(Control pParentControl)
{
if (pParentControl == null) return;
// position the popup window
var loc = pParentControl.PointToScreen(new Point(0, pParentControl.Height));
m_tsdd.Show(loc);
m_control.Focus();
}
public void Close()
{
m_tsdd.Close();
}
public void Dispose()
{
m_control.Resize -= MControlResize;
m_tsdd.Dispose();
m_hostPanel.Dispose();
}
}
用法:
private PopupHelper m_popup;
private void ShowPopup()
{
if (m_popup == null)
m_popup = new PopupHelper(yourListControl);
m_popup.Show(this);
}