如何在关闭xcool窗口表单时停止关闭整个应用程序

时间:2018-09-05 06:53:20

标签: .net winforms

我有一个类似CMS的项目,正在研究中,并添加了一个主题xcool。

这里有50个窗口窗体,但是现在的问题是,在关闭一个窗口窗体时,整个应用程序正在关闭。

当我删除此主题时,它的效果很好。我没有找到任何关闭主题的方法,等等。

我尝试过的事情:

using System.IO;

namespace CampusManagement
{
    public partial class Student_Reg : XCoolForm.XCoolForm

    private XmlThemeLoader xtl = new XmlThemeLoader();


    this.TitleBar.TitleBarBackImage = CampusManagement.Properties.Resources.predator_256x256;
    this.MenuIcon = CampusManagement.Properties.Resources.alien_vs_predator_3_48x48.GetThumbnailImage(24, 24, null, IntPtr.Zero);
    xtl.ThemeForm = this;
    this.Border.BorderStyle = XCoolForm.X3DBorderPrimitive.XBorderStyle.Flat;
    this.TitleBar.TitleBarBackImage = CampusManagement.Properties.Resources.Mammooth_1;
    this.TitleBar.TitleBarCaption = "Campus Management System";
    xtl.ApplyTheme(Path.Combine(Environment.CurrentDirectory, @"..\..\Themes\BlueWinterTheme.xml"));

1 个答案:

答案 0 :(得分:1)

有两种方法可以解决此问题。

1)如果您查看XCoolForm的源,请在XCoolForm.cs事件处理程序下的OnMouseDown中。它在两个地方检查单击的按钮是否为关闭按钮(第312行和第353行)。如果单击关闭按钮,则退出应用程序。

else if (xbtn.XButtonType == XTitleBarButton.XTitleBarButtonType.Close)
{
    Application.Exit();
}

您想将Application.Exit()更改为Close()

else if (xbtn.XButtonType == XTitleBarButton.XTitleBarButtonType.Close)
{
    Close();
}

2)另一个选项是重写OnMouseDown事件。但是您需要保护m_xTitleBarPointInRect以便可以访问它们。在XCoolForm.cs中,将第{63行中的m_xTitleBar从专用更改为受保护:

protected XTitleBar m_xTitleBar = new XTitleBar();

并在第935行上将PointInRect函数从private更改为protected:

protected bool PointInRect(Point p, Rectangle rc)

然后在您的表单中,您可以覆盖鼠标按下事件,如下所示:

protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
{
    foreach (XTitleBarButton xbtn in m_xTitleBar.TitleBarButtons)
    {
        if (PointInRect(
            e.Location,
            new Rectangle(
                xbtn.XButtonLeft,
                xbtn.XButtonTop,
                xbtn.XButtonWidth,
                xbtn.XButtonHeight
            )))
        {
              // We just want to check if it was the close button that was clicked, if so then we close this form.
              if (xbtn.XButtonType == XTitleBarButton.XTitleBarButtonType.Close)
              {
                  Close();
                  return;
              }
        }
    }

    // It wasn't the close button that was clicked, so run the base handler and let it take care of the button click.   
    base.OnMouseDown(e);
}