TabControl - 自动滚动无法正常工作
TabControl - Autoscroll doesnt work proper
我有以下问题,我正在创建一个带有几个 TabPage 的 TabControl,TabPage 中的内容是动态生成的,所以我决定让 Autoscroll = true。当我现在在选项卡上更改时,我首先必须按下一个文本框或复选框,我可以滚动,这真的很烦人。当滚动功能立即激活时,当我更改选项卡时会好得多。我尝试了一些重点,但它没有改变任何东西。
TabControl tc = new TabControl();
tc.TabPages.AddRange(new TabPage[]
{
new TabPage("Noten 2015"),
new TabPage("Noten 2014"),
new TabPage("History 2013-2010"),
new TabPage("Sonstiges")});
}
for (int i = 0; i <= 3; i++)
{
tc.TabPages[i].AutoScroll = true;
}
投诉含糊不清,操作滚动条肯定不会有问题。我不得不猜测你真正的问题与鼠标滚轮有关。鼠标滚轮消息被发送到具有焦点的控件。单击选项卡时,这将是 TabControl。它对滚动消息没有任何用处,它是实现滚动的客户端标签页。
因此,您正在寻找的可能解决方法是在选择选项卡后立即自动将焦点移动到选项卡页内的控件。为 SelectedIndexChanged 事件实施事件处理程序:
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) {
var page = tabControl1.SelectedTab;
page.SelectNextControl(page, true, true, true, true);
}
但这不是一个完美的解决方案,当您使用 Tab 或光标键导航到选项卡控件时,它仍然无法正常工作。或者如果标签页没有任何可以接收焦点的控件。更通用的解决方案需要更多的手术,您需要将鼠标滚轮消息从选项卡控件转发到活动选项卡页面。向您的项目添加一个新的 class 并粘贴如下所示的代码。编译。将新控件从工具栏顶部拖到窗体上,替换现有控件。
using System;
using System.Windows.Forms;
class TabControlEx : TabControl {
private bool recurse;
protected override void WndProc(ref Message m) {
const int WM_MOUSEWHEEL = 0x20a;
if (!recurse && m.Msg == WM_MOUSEWHEEL && this.SelectedTab != null) {
recurse = true;
SendMessage(this.SelectedTab.Handle, m.Msg, m.WParam, m.LParam);
recurse = false;
m.Result = IntPtr.Zero;
return;
}
base.WndProc(ref m);
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
}
我有以下问题,我正在创建一个带有几个 TabPage 的 TabControl,TabPage 中的内容是动态生成的,所以我决定让 Autoscroll = true。当我现在在选项卡上更改时,我首先必须按下一个文本框或复选框,我可以滚动,这真的很烦人。当滚动功能立即激活时,当我更改选项卡时会好得多。我尝试了一些重点,但它没有改变任何东西。
TabControl tc = new TabControl();
tc.TabPages.AddRange(new TabPage[]
{
new TabPage("Noten 2015"),
new TabPage("Noten 2014"),
new TabPage("History 2013-2010"),
new TabPage("Sonstiges")});
}
for (int i = 0; i <= 3; i++)
{
tc.TabPages[i].AutoScroll = true;
}
投诉含糊不清,操作滚动条肯定不会有问题。我不得不猜测你真正的问题与鼠标滚轮有关。鼠标滚轮消息被发送到具有焦点的控件。单击选项卡时,这将是 TabControl。它对滚动消息没有任何用处,它是实现滚动的客户端标签页。
因此,您正在寻找的可能解决方法是在选择选项卡后立即自动将焦点移动到选项卡页内的控件。为 SelectedIndexChanged 事件实施事件处理程序:
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) {
var page = tabControl1.SelectedTab;
page.SelectNextControl(page, true, true, true, true);
}
但这不是一个完美的解决方案,当您使用 Tab 或光标键导航到选项卡控件时,它仍然无法正常工作。或者如果标签页没有任何可以接收焦点的控件。更通用的解决方案需要更多的手术,您需要将鼠标滚轮消息从选项卡控件转发到活动选项卡页面。向您的项目添加一个新的 class 并粘贴如下所示的代码。编译。将新控件从工具栏顶部拖到窗体上,替换现有控件。
using System;
using System.Windows.Forms;
class TabControlEx : TabControl {
private bool recurse;
protected override void WndProc(ref Message m) {
const int WM_MOUSEWHEEL = 0x20a;
if (!recurse && m.Msg == WM_MOUSEWHEEL && this.SelectedTab != null) {
recurse = true;
SendMessage(this.SelectedTab.Handle, m.Msg, m.WParam, m.LParam);
recurse = false;
m.Result = IntPtr.Zero;
return;
}
base.WndProc(ref m);
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
}