CODEKILLER

반응형

WaitForm Loading 팝업만들기
WaitForm Loading 팝업만들기

SplashScreenManager를 이용하여 Loading 팝업 만들기

DevExpress에서 WaitForm 클래스를 제공하고 있습니다. 개발자 입장에서는 WaitForm을 어떠한 방식(ex. Pop, Background Thread, SplashScreenManager)으로 사용자에게 보여줄지만 고민하면 됩니다. 

 

첫 번째, WaitForm을 한번 감싸주는 Form을 만들어줍니다.

using DevExpress.XtraWaitForm;
...
public partial class LoadingForm : WaitForm
{
    public WaitFormEx()
    {
        InitializeComponent();

        this.progressPanel1.AutoWidth = false;
        this.progressPanel1.AutoHeight = false;
        this.StartPosition = FormStartPosition.CenterParent;
        this.ShowOnTopMode = ShowFormOnTopMode.ObsoleteAboveParent;
    }

    public override void SetCaption(string caption)
    {
        base.SetCaption(caption);
        this.progressPanel1.Caption = caption;
    }

    public override void SetDescription(string description)
    {
        base.SetDescription(description);

        this.progressPanel1.Description = description;
    }
    
    public enum emType
    {
        SetProgress
    }

    public override void ProcessCommand(Enum command, object argument)
    {
        base.ProcessCommand(command, argument);
    }
}

 

두 번째, LoadingForm을 띄워주는 Util 클래스를 만들어 줍니다. WaitForm을 new로 생성하여 팝업으로 띄워줄 수도 있겠지만 그런 방법 말고 띄워주는 부분도 DevExpress에서 지원하는 SplashScreenManager를 사용해서 띄워보도록 하겠습니다.

 

SplashScreenManager 클래스를 이용하여 WaitForm을 띄우는 것은 얼핏 보면 Modal 같지만 팝업 뜬 후에도 팝업 아래에 있는 컨트롤들이 클릭이벤트를 받습니다. WaitForm이 닫힌 뒤에 이벤트가 동작을 하게 됩니다. 이러한 예상치 못한 이벤트를 막기 위해서는  Parent 세팅과, ParentFormState.Locked 옵션을 사용하여 폼이 떠있는 동안에는 뒤를 클릭하지 못하도록 막아줍니다.

using DevExpress.XtraSplashScreen;
...
// WaitForm이 떴을때 뒤에 있는 컨트롤들이 이벤트를 받음 (사용X)
public static void ShowWaitForm(string caption = null)
{
    if (SplashScreenManager.Default == null)
    {
        SplashScreenManager.ShowForm(typeof(LoadingForm), true, true);

        if (!string.IsNullOrEmpty(caption))
        {
            if (SplashScreenManager.Default != null)
                SplashScreenManager.Default.SetWaitFormCaption(caption);
        }
        Thread.Sleep(1000);
    }
}
        
 // WaitForm 띄우는 함수 (사용O)
 public static void ShowWaitFormLock(Form parent = null, string caption = null)
 {
     if (SplashScreenManager.Default == null)
     {
         if (parent == null)
             // parent를 지정하지 않으면 Application Main의 가운데에 뜨도록 세팅
             SplashScreenManager.ShowForm(Application.OpenForms[typeof(/*요기에 Application Main Form을 넣어줍니다.*/).Name], typeof(LoadingForm), true, true, ParentFormState.Locked);
         else
             // 인자로 넘어오는 Form의 가운데 뜨도록 세팅
             SplashScreenManager.ShowForm(parent, typeof(LoadingForm), true, true, ParentFormState.Locked);

         // 캡션이 있다면 텍스트가 변경되도록 설정.
         if (!string.IsNullOrEmpty(caption))
         {
             if (SplashScreenManager.Default != null)
                 SplashScreenManager.Default.SetWaitFormCaption(caption);
         }
         Thread.Sleep(100);
     }
 }

 // Description Text가 변경하는 함수
 public static void SetWaitFormDescription(string desc)
 {
     if (SplashScreenManager.Default != null)
     {
         SplashScreenManager.Default.SetWaitFormDescription(desc);
     }            
 }

 // WaitForm을 닫는 함수
 public static void CloseWaitForm()
 {
     if (SplashScreenManager.Default != null)
     { 
         SplashScreenManager.CloseForm();
     }
 }

 

세 번째, 팝업 열기, 닫기 

try
{
    // Loading 팝업 열기
    Util.ShowWaitFormLock();
    
    ... 로직
    
    // Loading 팝업 닫기
    Util.CloseWaitForm();
}
catch
{
}
finally
{
    // Loading 팝업 닫기
    Util.CloseWaitForm();
}

 

WaitForm 띄우기
WaitForm 띄우기

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band