본문 바로가기

Programming/WPF30

WPF. EventHandler를 비하인드 코드가 아닌 ViewModel에 구현하기 WPF를 가지고 여러가지 만들다보면.. Event Handling을 처리해야할 경우가 제법 있다. 근데.. xaml에서 Event="MyEventHandlerName"을 입력하면.. 비하인드 코드에 작성이 된다. 뭐.. 비하인드 코드에 작성하는것이 잘못된건 아닌데.. MVVM패턴을 쓸때에는 가급적이면.. ViewModel에서 핸들링 하게 구현하는것이 더 좋다. 비하인드에 구현할 경우 여러가지 불필요한 코드들이 추가되어야하는 경우가 제법 있다. 그런 불필요한 코드들을 추가하기 싫다면.. VM을 static 또는 global로 선언하고, 그 안에서 모든 멤버들을 public으로 오픈하면 되는데.. ViewModel이 아닌 객체가 ViewModel의 멤버에 함부로 접근하도록 설계하는 것이 좋을지 나쁠지는 뭐... 2022. 10. 20.
WPF의 routedevent. Event처리시 e.handle=true를 해주는 이유 먼저.. WPF에서 UI Element에 대해서 간단히 그리면 아래와 같다. 그냥 UserControl에 Grid와 Button하나를 다음과 같이 넣는다고 해보자. 화면에는 이렇게 그려질거다.. z-index를 기준으로 그리면 아래와 같고.. 여기서 만약 사용자가 Test1 버튼을 누르면.. 이벤트는 다음과 같은 경로로 발생된다. Base Element -> Control 까지 내려갔다가, 다시 Control -> Base Element로 넘어온다. 이 과정에서 내가 event를 별도로 처리하기 위해 EventHandler를 구현했을때.. 이후에 더이상 routed event를 진행하지 않겠다고 한다면, e.handle = true로 설정해준다. private void Test1Button_Click(o.. 2022. 10. 20.
MVVM패턴 구현 - RelayCommand 만들기 WPF에서 MVVM패턴을 적용하여 개발하려면, View와 ViewModel간에 데이터 통로가 필요하다. 먼저.. 사용자의 action을 처리해줄려면 Command로 엮어줘야한다. Command를 만드는 방법에 대해서 간단하게 기술한다. (물론 나중에 포스팅할 PRISM이라는 매우 편리한 라이브러리가 있다.) 커맨드를 만들기 위해서는 ICommand를 상속받는 클래스를 하나 정의해야한다. (사실 범용성을 위해서는 2개..) public class RelayCommand : ICommand { // 해당 커맨드를 실행할 조건을 담는 Predicate private readonly Predicate _canExecute; // 실제 수행될 메소드를 담는 Action private readonly Action .. 2022. 9. 7.
WPF란? - Windows Presentation Foundation WPF를 떠나 자바로 전향하면서 WPF에 대해 적기 위한 카테고리. C#개발자분들은 WPF는 한번쯤은 들어봤을 녀석. 나온지는 오래되었다. 내가 2009년에 WPF개발을 시작했으니.. 먼저.. WPF는 Windows Presentation Foundation임. 윈도우에서 표시되는 모든것의 기초다. UI를 위한 프레임워크. 매우 강력한 UI프레임워크다. 그때나 지금이나.. UI에 투자해야하는 시간이 엄청 많은게 클라이언트 개발인데.. (하지만 사람들은 UI를 쉽게보지...) WPF는 개발자들이 UI에 투자해야하는 고통을 획기적으로 줄여주었다. WPF는 .NET Framework위에서 돌아가므로 .NET Framework가 필요하다. (물론 WPF는 .NET Framework가 아닌 .NET에서도 살아있는.. 2022. 7. 29.
C#에서 RestAPI호출하기 얼마전에 C#에서 RestAPI서버에 무언가를 요청하고 받아올 일이 있었다. 그때 기억을 되새기며.. RestAPI를 호출하려면 서버에 요청하고 받아와야겠지? 일일이 포트 뚫고.. 처리해야할.. 필요가 없다. .net을 잘 활용해야지. HttpClient를 이용하여 웹 요청을 주고받을 수 있다. 예전에는 HttpWebRequest를 사용했었는데, 이것은 deprecated. 그리고 그 대체제로 HttpClient가 나왔으니.. 이제 그걸로 사용하자. 사용법은 간단하다. using Newtonsoft.Json; //Json으로 파라미터 보낼거면. 요거쓰자. using System.Net; public async Task PostAPICall(string url, object param){ HttpClien.. 2022. 7. 22.
C# 마샬링 - 구조체 C#에서 C++의 DLL을 호출할 경우 데이터를 주고받아야 한다. 그렇게 하기 위해서 여러가지 방법이 있지만, 우선 DLL을 만든 후, DllImport를 사용하여 전달하게 구성되었기에. 그에 맞는 방법으로.. C#에서 -메소드 선언 [DllImport("$DLL파일명", CallingConvention=CallingConvention.Cdecl, Charset=CharSet.Ansi)] public static extern $반환타입 $메소드명($params) 위와 같이 선언하면 된다. 콜링컨벤션은 굳이 안해도 되는듯. charset은 나는 MBCS를 사용하느라 그냥 명시적으로 선언해 주었다. C++에서 #define DLLAPI extern "C" __declspec(dllexport) DLLAPI .. 2022. 7. 21.
728x90