【问题标题】:WinForm : Make control unfocusableWinForm:使控件无法聚焦
【发布时间】:2023-02-17 00:19:14
【问题描述】:

我的 winform 包含一个 TextBox,它是窗体的主要控件。当我执行 CtrL + C 时,通常会得到一个空的剪贴板,因为出于某种原因,表单的 ActiveControl 被设置为另一个控件,例如 TabControl、SplitContainer 等。我试图设置这些控件 TabStop = fasle ,但有用。有没有办法阻止所有控件获得焦点?不仅关于鼠标点击,还有 Tab 键。

【问题讨论】:

  • 考虑到这一点,我认为这不可能阻止控件成为 activeControl。为了拖动 splitContainer 拆分器,它必须成为 activeControl。也许完成我想要的正确方法是在鼠标释放分离器时重置 activeControl。

标签: winforms controls


【解决方案1】:

您找不到可以处理所有控件的通用解决方案。在你的情况下,对于 TabControl 和 SplitterContainer 我可以建议如下:

  • 选项卡控件:处理 SelectedIndexChanged,然后将焦点移动到选项卡的第一个可聚焦控件。
  • 拆分器容器:处理 MouseDown 以捕获拆分的开始,然后存储活动面板;稍后处理 SplitterMoved 并将焦点移动到活动面板的第一个可聚焦控件。

这是对我有用的:

SplitterPanel activePanel;
private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
{
    splitContainer1.SelectNextControl(activePanel, 
        forward: true, tabStopOnly: true, nested: true, wrap: true);
}
private void splitContainer1_MouseDown(object sender, MouseEventArgs e)
{
    activePanel = splitContainer1.Panel1.ContainsFocus ? splitContainer1.Panel1 :
        splitContainer1.Panel2.ContainsFocus ? splitContainer1.Panel2 : null;
}

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
    var page = this.tabControl1.SelectedTab;
    page.SelectNextControl(null,
        forward: true, tabStopOnly: true, nested: true, wrap: true);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-20
    • 2011-11-01
    • 2010-10-17
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    相关资源
    最近更新 更多