恢复TabControl内部的SplitterDistance不一致

时间:2020-03-06 14:41:05  来源:igfitidea点击:

我正在编写WinForms应用程序,并且TabControl中的其中一个选项卡具有SplitContainer。我在用户的应用程序设置中保存了SplitterDistance,但是还原不一致。如果带有拆分器的选项卡页面可见,则还原工作正常,拆分器的距离与我离开时的距离相同。如果选择了其他标签,则分光器距离错误。

解决方案

我发现了问题。在选择每个选项卡页面之前,不会调整其大小以匹配选项卡控件。例如,如果在设计器中选项卡控件的宽度为100像素,而我们刚刚在加载过程中将其设置为500像素,则在隐藏的选项卡页面上将分隔线距离设置为50时,调整大小为分隔线距离为250我们选择该标签页。

我通过在应用程序设置中记录SplitContainer的SplitterDistance和Width属性来解决此问题。然后在还原时,我将SplitterDistance设置为recordedSplitterDistance *宽度/ recordedWidth。

有一个更简单的解决方案。如果将Panel1设置为SplitContainer.FixedPanel属性中的固定面板,则所有面板的行为均与预期的一样。

为了处理FixedPanel和方向的所有情况,应执行以下操作:

var fullDistance = 
           new Func<SplitContainer, int>(
               c => c.Orientation == 
                  Orientation.Horizontal ? c.Size.Height : c.Size.Width);

        // Store as percentage if FixedPanel.None
        int distanceToStore =
           spl.FixedPanel == FixedPanel.Panel1 ? spl.SplitterDistance :
           spl.FixedPanel == FixedPanel.Panel2 ? fullDistance(spl) - spl.SplitterDistance :
           (int)(((double)spl.SplitterDistance) / ((double)fullDistance(spl))) * 100;

然后在还原时执行相同的操作

// calculate splitter distance with regard to current control size
        int distanceToRestore =
           spl.FixedPanel == FixedPanel.Panel1 ? storedDistance:
           spl.FixedPanel == FixedPanel.Panel2 ? fullDistance(spl) - storedDistance :
           storedDistance * fullDistance(spl) / 100;