White Whale Studio

[WPF] 윈도우간 데이터 교환, 유저 컨트롤간 데이터 교환을 위한 방법 본문

IT Engineering/.Net (WPF)

[WPF] 윈도우간 데이터 교환, 유저 컨트롤간 데이터 교환을 위한 방법

glorymind 2013. 11. 1. 14:00
반응형

오랜만의 포스팅입니다.

오늘은 제목과 같이 데이터 교환을 위한 방법에 대해서 살펴보고자 합니다.

 

메인 윈도우에서 유저컨트롤을 추가하거나 자식 윈도우를 생성하는 경우

자식 윈도우나 유저컨트롤로부터 데이터를 받아야할 경우가 있을 겁니다.

이러한 경우에 주요 사용되며 방법이야 몇가지 방법이 있겠지만

제가 사용할 방법은 이벤트를 이용한 방법입니다.

일반적으로 제공 컨트롤을 통한 이벤트를 자주 접하시겠지만

이벤트를 생성하여서 파라미터를 전달하는 방식을 사용할겁니다.



우선 상황을 설명하자면

부모 윈도우가 있고 자식윈도우가 있다고 가정하고

자식윈도우에서 특정값을 입력 후 부모 윈도우에서 그 값을 출력하고자 할 때를 예를 들겠습니다.


 

 

 


다음은 자식윈도우의 코드입니다.


        public ChildWindow()

        {

            InitializeComponent();

        }


        public delegate void OnChildTextInputHandler(string Parameters);

        public event OnChildTextInputHandler OnChildTextInputEvent;


        private void button1_Click(object sender, RoutedEventArgs e)

        {

            if (OnChildTextInputEvent != null) OnChildTextInputEvent(textBox1.Text);

        }


우선 자식 윈도우에서의 코드에서는

클래스 내부에서


public delegate void OnChildTextInputHandler(string Parameters);

public event OnChildTextInputHandler OnChildTextInputEvent;


저는 위와같이 이벤트를 정의했습니다.

public delegate void 는 이벤트 형태를 정의하는것이고 OnChildTextInputHandler는 제가 만든 이벤트명입니다.

string Parameters는 string 형태의 파라미터를 받겠다는 것을 의미하겠죠?


그 다음으로 실제 이벤트 객체라고 볼수있는 OnChildTextInputEvent 를 정의했습니다.

이와 같이 정의를 한 상태에서 버튼 이벤트가 발생하는 경우 OnChildTextInputEvent 이벤트에 string 타입의 파라미터를 넘깁니다. 여기서 파라미터는 textbox에 입력한 내용이 되겠죠?


다음은 부모 윈도우입니다.


        public ParentWindow()

        {

            InitializeComponent();

        }


        ChildWindow cw = null;

        private void button1_Click(object sender, RoutedEventArgs e)

        {

            if (cw == null)

            {

                cw = new ChildWindow();

                cw.OnChildTextInputEvent += new ChildWindow.OnChildTextInputHandler(cw_OnChildTextInputEvent);

                cw.Show();

            }

        }


        void cw_OnChildTextInputEvent(string Parameters)

        {

            textBlock1.Text = Parameters;

            if (cw != null)

            {

                cw.Close();

                cw.OnChildTextInputEvent -=new ChildWindow.OnChildTextInputHandler(cw_OnChildTextInputEvent);

                cw = null;

            }

        }


부모 윈도우에서는 자식 윈도우를 호출하는 버튼을 넣었는데요.


 버튼을 클릭하게 되면 자식 윈도우 컨트롤의 생성 및 자식 윈도우에서 생성한 이벤트를 연결시켜줍니다. 즉, 자식 윈도우에 OnChildTextInputEvent 이름의 이벤트가 기다리고 있는데

부모 윈도우에서 OnChildTextInputEvent 라는 이벤트가 발생했을 때 어떻게 조치를 하겠다~ 하고 

이벤트에대한 Handler를 만드는 겁니다. new ChildWindow.OnChildTextInputHandler 를 통해서 생성된 부분은 위와 같습니다.


우선 텍스트블럭 컨트롤에 받아온 파라미터(자식윈도우의 텍스트박스에 입력한 내용이겠죠)

를 출력해주고 만약 자식 윈도우가 살아있는 상태라면 종료를 시키고, 걸어둔 이벤트 핸들러를 삭제하고, 자식 윈도우에 할당된 정보를 null화 합니다.(이 부분은 넣어주셔야지 정상적으로 반복 사용이 가능합니다.) 이런 방식으로 사용하기 위해서 위에 보시면 ChildWindow cw = null;와 같이 정의를 했죠.

 

 

위에 첨부한 스샷과 같이 정상적으로 작동을 합니다.

다음에는 유용하게 사용할 수 있는 유저 컨트롤에 대해서 살펴볼 예정입니다.

(귀차니즘이 절 붙잡지 않는다면요..)









 

반응형
Comments