首页 > 解决方案 > 自定义控件上的可选覆盖

问题描述

我有一个自定义TabControl代码,既可以防止用户使用 Tab 快捷方式进行导航,也可以删除选项卡标题。有一种情况,我仍然想阻止选项卡导航,但显示选项卡标题,所以我想为自定义控件创建一个属性,并且仅在此属性为时应用隐藏标题的代码true,但我得到了从这里删除选项卡标题的解决方案,我不完全理解。

我尝试将代码放在if我的属性中,但这会使我的视觉工作室崩溃。我想这是因为这样做我将使用空过程覆盖必要的代码useHide == false,那么,当useHide == false它运行常规继承代码而不是覆盖它时,我该如何做呢?

    public class ExTabControl : TabControl
    {
        private bool useHide = true;

        [Description("Hide tab headers."), Category("Appearance")]
        public bool UseHideTabs
        {
            get => useHide;
            set => useHide = value;
        }

        /// Intercept any key combinations that would change the active tab.
        protected override void OnKeyDown(KeyEventArgs e)
        {
            bool changeTabKeyCombination =
                (e.Control
                    && (e.KeyCode == Keys.Tab
                        || e.KeyCode == Keys.Next
                        || e.KeyCode == Keys.Prior));

            if (!changeTabKeyCombination)
            {
                base.OnKeyDown(e);
            }
        }

        private const int TCM_ADJUSTRECT = 0x1328;

        protected override void WndProc(ref Message m)
        {
            if (useHide == true)
            {
                // Hide the tab headers at run-time
                if (m.Msg == TCM_ADJUSTRECT && !DesignMode)
                {
                    m.Result = (IntPtr)1;
                    return;
                }

                // call the base class implementation
                base.WndProc(ref m);
            }
        }
    }

.NET 框架 4.7.2、Visual Studio 2019、Winforms 应用程序

标签: c#custom-controls

解决方案


当为假时,您缺少基本方法的调用,请useHide尝试使用此方法。

protected override void WndProc(ref Message m)
{
    // Hide the tab headers at run-time
    if (useHide && m.Msg == TCM_ADJUSTRECT && !DesignMode)
    {
        m.Result = (IntPtr)1;
        return;
    }

    // call the base class implementation
    base.WndProc(ref m);
}

推荐阅读