【问题标题】:Split Container SplitterDistance changes without user intervention拆分容器 SplitterDistance 更改无需用户干预
【发布时间】:2023-03-24 20:57:01
【问题描述】:

我的 Winforms 应用程序在数据库中保存和恢复其 GUI 状态。一切正常,除了拆分容器的 SplitterDistance。

该值已从 DB 正确加载和设置,但是当我退出应用程序 而不 触摸拆分器时,我希望它保存相同的值。但它保存了初始值减去 25 个像素。如果我多次打开和关闭应用程序,分割器距离每次减少 25 像素。

它不是一个自定义控件,只是一个普通的旧 .NET SplitContainer。该控件仅以编程方式访问以加载其初始 SplitterDistance 并在退出时保存它,仅此而已。

我该如何解决这个问题?

更新:spl 的FixedPanel 属性最初设置为None。尝试将其设置为Panel1 和Panel2;在这两种情况下,当我保存时,SplitterDistance 增长 50 像素。

【问题讨论】:

    标签: .net winforms splitcontainer


    【解决方案1】:

    download sample application

            // my splitContainer1 is Horizontal so i used splitContainer1.ClientSize.Height 
            // if you have splitContainer1 is Vertical use splitContainer1.ClientSize.Width
            // without FixedPanel save and load """  
            // loading SplitterDistance from ini file
            int splitContainery = 0;
            splitContainery = (Win32.GetPrivateProfileInt(PluginName, "splitContainer", 0, iniFilePath));
            splitContainer1.SplitterDistance = splitContainer1.ClientSize.Height - splitContainery;
    
            // saving splitContainer1.SplitterDistance to ini file
            int hhkt = splitContainer1.ClientSize.Height - splitContainer1.SplitterDistance;
            Win32.WritePrivateProfileString(PluginName, "splitContainer", hhkt.ToString(), iniFilePath);
    

    【讨论】:

    • 最好包含一两句话来说明您的解决方案如何解决所提出的问题。
    【解决方案2】:

    您在拆分容器内是否有用户控件,并且可能当它们全部加载时,它会与包含它的用户控件一起调整大小。

    要解决此问题,请设置 FixedPanel 属性并观察它。

    【讨论】:

    • 查看我的更新。可以调整整个拆分容器的大小吗?
    • 为调整大小事件添加了一个处理程序,是的,容器正在调整大小。所以现在我认为一旦我确定 .NET 完成调整所有内容的大小(何时?),我应该从 DB 设置 SplitterDistance。
    • 分割器容器的宽度是否相等,加载到屏幕时的窗口大小是多少?
    • 我解决了。在我使用 DB 中的值设置 SplitterDistance 后,会触发一个 resize 事件,该事件会更改拆分容器的大小和 SplitterDistance。使用调用堆栈,我发现拆分容器上方的另一个控件正在调整大小。如果我在处理其他控件后设置 SplitterDistance,一切正常。我接受您的回答,因为它为我指明了正确的方向。
    • 我想这就是我放“观察它”的原因:),很高兴你解决了它。
    【解决方案3】:

    我使用上述响应如下(我的拆分器是垂直的):

    private void Form1_Load(object sender, EventArgs e) 
    {
        int splitContainery = Properties.Settings.Default.SplitterDistance;
        if(splitContainery < splContainer.ClientSize.Width)
            splContainer.SplitterDistance = splContainer.ClientSize.Width - splitContainery;
    }
    
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        int splitContainery = splContainer.ClientSize.Width - splContainer.SplitterDistance;
        Properties.Settings.Default.SplitterDistance = splitContainery;
        Properties.Settings.Default.Save();            
    }
    

    我为 splContainer.SplitterDistance 创建了 PropertyBinding,但没有将它绑定到属性,只是为了将它放在 ApplicationSettings 文件中。

    【讨论】:

      【解决方案4】:
      int splitContainery = Properties.Settings.Default.SplitterDistance;
      

      如果我可以使用Properties.Settings.Default.SplitterDistance,那么我将永远无法使用 ini 文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-02
        • 2011-01-12
        • 2015-12-30
        • 1970-01-01
        • 2013-03-06
        • 1970-01-01
        • 1970-01-01
        • 2011-11-16
        相关资源
        最近更新 更多