在父控件的边界之外显示用户控件内部的控件。

9
我有一个用户界面控件,里面包含一个文本框和一个列表框,用于为用户提供自动完成功能。
但是,我希望在列表框靠近用户界面控件边缘时能够超出其范围,以防止其被截断。你有什么建议吗?实际上,我想让列表框浮动在其容器控件的外部。
我唯一想到的方法是,在实例化时将外部列表框的引用传递给用户界面控件,然后操纵该列表框而不是将其放置在用户界面控件内部,但我不喜欢这种方法。谢谢。

用户控件的边界是什么意思? - Ben Robinson
1
@BenRobinson:文本框会扩展以填充用户控件。如果用户在文本框边缘附近输入,实际上他就是在用户控件边缘附近输入。如果我在光标位置显示一个列表框,它将被用户控件边界截断。我不希望发生这种情况。 - user1391664
抱歉,我没有看到你的标签,我一直在考虑 ASP.NET 用户控件。 - Ben Robinson
1个回答

7

问题在于,您无法逃出容器的边界,但可以将控件托管到其他地方。

以下是我通过滥用 ToolstripDropDown 类获得的工作结果(我使用它在大型企业应用程序中显示日期选择器):

/// <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);
    }

对于多个控件 - Ravi

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