반응형

WPF 에서 Singleton 패턴 적용하는 법을 포스팅 할게요.


실질적으로 전에 C# 에서 싱글톤 패던 적용하는 거랑 거의 비슷한데요. WPF에서는 C#에 있는게 없는 부분도 있어서


약간 다르게 적용을 해야됩니다.



<그림 1>



Singleton pattern 을 적용시킨 페이지를 스샷 찍어서 올리는데 많이 안보이네요...화질도 안좋고...


슬퍼2


<그림 1 - Code>


using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;


namespace WpfApplication1

{

    /// <summary>

    /// Window1.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class Window1 : Window

    {

        static Window1 instance = null;

        static readonly object padlock = new object();


        public static Window1 Instance

        {

            get

            {

                lock (padlock)

                {

                    if (instance == null)

                    {

                        instance = new Window1();

                    }

                    

                    return instance;

                }

            }

        }


        public Window1()

        {

            instance = this;

            InitializeComponent();

        }

        private void Window_Closed(object sender, EventArgs e)

        {

            instance = null;

        }


    }

}

 


그림 1의 스샷을 위에 박스에 고대로 코드로 옴겼습니다.


이러면 보기 편하겠죠?


C#에서는 Singleton을 쓰면 Isdiposed를 써서 창의 닫힘 과 열림의 유무를 알 수 있는데요.


WPF 에서는 Isdisposed가 없어서 쓰지를 못하네요. 이 부분 때문에 엄청나게 고생을 했지만..


엄청난 구글링으로 자료를 분석해서 적용했어요!!


Closed 부분에서 null을 해주는 이유는 윈도우 창을 생성해서 끄면 instance에는 여전히 값이 들어가 있어서


null이라는 공식이 적용이 안됩니다.


그래서 창을 생성하면 instance에 값이 들어가고 끄면 null 값이 들어가게 했습니다.


이 코드를 적용하지 Singleton이 재대로 적용이 되더라고요.


PS. 아 물론 Google에서 찾아서 약간씩 변형을 해서 쓰지만 정확한 답은 아니죠?



<그림 2>




Window Instance 부분을 키고 사라지게 하는 부분입니다.


실질적으로 버튼을 누르면 Singleton이 적용이 된 window가 생성이 되는 부분이죠.



<그림 2 - Code>


using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;


namespace WpfApplication1

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

        }


        private void button1_Click(object sender, RoutedEventArgs e)

        {

            Window1.Instance.Show();

        }


        private void button2_Click(object sender, RoutedEventArgs e)

        {

            Window1.Instance.Close();

        }

    }

}



Window1.Instance.Show() 써서 Window를 생성합니다.


WPF에서는 객체를 지우고 생성이 안되더라고요. 머라고 머라고 에러 나오면서요!!


결국은 Hide를 써보지만 프로세서에서 Close가 안되고요.


머..여러가지 문제가 있지만 결국 Window Closed를 하면 instance= null 라는 구분으로 해결은 했어요!!


예제 파일도 같이 올리겠습니다. 참고하시면 되요^^


Example File


WpfApplication1.zip


반응형

'프로그래밍 > WPF' 카테고리의 다른 글

[WPF] Cursor and DateTime-X-Axis (Tooltip 시간 출력) in D3 Graph  (2) 2014.05.23
[Blend4] WPF SketchFlow  (0) 2013.10.04
[WPF] KeyDown Event  (0) 2013.08.30
[WPF] Binding Property  (0) 2013.08.02
[WPF] Binding(바인딩)  (0) 2013.08.01