ASP.NET Core는 기본적으로 종속성 주입 패턴을 사용하고 있어서 따로 설정할게 없지만 WPF는 그렇지 않습니다. 만약 종속성주입이 귀찮다 하면 종속성 없이 사용해도 됩니다. 연관글 영역 1. 프로젝트 준비 WPF 프로젝트를 생성하고 종속성 주입 구현을 위해서 아래 패키지를 누겟(Nuget)에서 찾아 설치해 줍니다. Microsoft.Extensions.DependencyInjection 이 프로젝트에서는 콘솔출력도 사용할 예정이라 아래 패키지도 설치해 줍니다. Microsoft.Extensions.Hosting 로그파일 출력은 아래 패키지를 이용합니다. NReco.Logging.File 2. 종속성 주입 구현 'App.xaml'에서 'StartupUri'를 제거해 줍니다. 'App.xaml.cs'..
WPF에서 다른 쓰레드에서 UI를 사용하려면 인보크를 사용해야 합니다. (윈폼에서 비슷하긴 합니다.) 참고 : [WPF] 다른 스레드에서 UI쓰레드 접근하기 - Dispatcher.Invoke 연관글 영역 1. 인보크(Invoke)와 비긴인보크(BeginInvoke) 디스페쳐(Dispatcher)에 있는 인보크는 두 종류가 있습니다. 'Invoke'는 지연이 없는 인보크고 'BeginInvoke'는 지연이 있는 인보크입니다. 2. 두 종류의 차이 정확하게 말해서는 Invoke는 동기적 동작을 하고 BeginInvoke는 비동기적 동작을 합니다. (참고 : MSDocs - Dispatcher.Invoke 메서드, Dispatcher.BeginInvoke 메서드) 쓰래드라고해도 비동기 동작은 자신을 호출한 ..
그리드를 분할해야 사용자가 화면크기를 조절할 수 있게 됩니다. WPF에서는 'GridSplitter'를 사용해야 합니다. 이 컨트롤을 어떻게 사용하는지 알아봅시다. 이 포스팅은 MSDN을 참고하였습니다. 참고 : MSDN - 방법: GridSplitter로 행 크기 조정 1. 사용 전 알아야 하는 것 'GridSplitter'를 사용하려면 'GridSplitter'가 컬럼이든 로우든 한자리를 차지하고 있어야 합니다. 가로로 있는 스플리터를 쓰고 싶으면 컬럼을 하나 더 만들어야 하고 세로로 있는 스플리터를 쓰고 싶으면 로우를 하나 더 만들어야 합니다. 2. 디자인 MSDN의 코드를 따라 해봅시다. 다음과 같이 디자인합니다. 자말코드는 다음과 같습니다. 이 코드를 실행하면 아래와 같이 동작합니다. 3. 세로..
간만에 WPF를 하는데.....버튼으로 테스트해 보니 프로그램이 잘 돌아가서 타이머를 하나 만들어서 주기적으로 실행하려고 돌렸는데...에러가 퐝~ 연관글 영역 1. 원인많은 UI 구성 요소에서 호출 스레드가 필요하므로 해당 스레드는 STA여야 합니다.혹은"다른 스레드가 소유하고 있는 오브젝트에 현재 스레드가 접근할 수 없다"(The calling thread cannot access this object because a different thread owns it.) 이런 식의 오류가 나기도 합니다. 하도 오랜만에 WPF를 해서 감이 없네요;;WPF나 실버라이트에서 타이머는 다른 스레드기 때문에 UI스레드에 접근할 때 에러가 납니다. 2. 해결 방법이럴 때는 디스패처(Dispatcher) 인보크를 ..
일반적으로 게임을 만들 때는 게임 루프라는 무한 반복되는 루프를 만들어 만들게 됩니다. 이런 방법을 이용하는 이유는 검색하면 많이 나오기 때문에 따로 설명하진 않겠습니다. ( 이 정도 글을 읽으시면서 설마 이 정도도 모를라고? ㅎㅎㅎㅎ ) 여하튼 게임을 만드는데 꼭 게임 루프가 있어야 하느냐? 그건 아닙니다. 특히나 WPF나 실버라이트 같은 경우 자체적으로 UX프레임웍이 잘돼 있어서 더더욱 게임 루프 없이도 게임을 만드는 데 지장이 없습니다. (참고 : 아이유vs지연 프로젝트 ) 하지만 게임 루프가 필요할 때가 있죠.. 여전히 기존 프래임웍과 게임 루프를 어떻게 연결하여 사용해야 할지 의문이긴 합니다만... 뭐 일단 게임 루프부터 만들고 알아보도록 하죠 ㅎㅎㅎ 프로젝트 생성은 "GameLoop_Compo..
기본적인 버튼의 모양은 엄청 투박합니다. WPF씩이나 쓰면서 이런 버튼을 그냥 쓸 순 없죠 ㅋㅋㅋㅋ 블렌드를 사용하여 간단하게 이미지 버튼을 만들어 봅시다. 1. 프로젝트 생성 WPF프로잭트를 하나 생성한 후 버튼을 하나 추가합시다. (꼭 버튼이 아니여도 상관없습니다.) 버튼으로 사용할 이미지를 '프로젝트 탭'으로 드래그하여 추가합니다. 2. 컨트롤로 만들기 버튼에서 오른쪽 클릭을 한 후 '컨트롤로 만들기(Make Into Control...)' 를 누릅니다. 컨트롤 타입(Control type)을 버튼으로 해주시고 이름(Name)을 적당히 넣어주세요. 디파인 인(Define in)는 이 버튼 스타일을 어디에 선언할지를 선택하는 것입니다. 일반적으로 이런 스타일들은 App(Application)에 선언합..
전통적인 C# 프로그램에서 프로그램을 종료시킬 때 사용하는 방법은 Application.Exit(); Environment.Exit(0); System.Diagnostics.Process.GetCurrentProcess().Kill(); 이렇게 많이 사용합니다. (참고 : [.NET] 응용프로그램 종료 메서드 비교 ) 가끔 창이 하나이거나 메인 폼이 중심이 되는 경우 아래와 같이 사용할 때도 있습니다. this.Close(); 그러다 문득 "WPF에서도 똑같은가?" 라는 의문이 들었습니다. 연관글 영역 윈폼(WinForm) 메서드 시도 WinForm과 WPF와는 미묘한 차이가 있는데 이런 것들은 사실 직접 격기 전에는 알기가 힘듭니다. 그래서 한번 해보았습니다. 'Application.Exit();'를 ..
이전 글에서 4.0이후버전에서 트랜스폼을 지정해 봤는데요 이전버전에서는 트랜스폼그룹(TransformGroup)을 생성하여 사용하면 됩니다. (참고 : [WPF/Silverlight] 4.0이후 버전에서 동적으로 트랜스폼(Transform) 지정하기) 한땀 한땀 원하는 트랜스폼을 추가해야 하죠. private void StartAni(Button btnMe) { //스토리보드 Storyboard story = new Storyboard(); DoubleAnimation daTemp = null; //트랜스폼 추가 //랜드트랜스폼 생성 TransformGroup tg = new TransformGroup(); tg.Children.Add(new TranslateTransform()); tg.Children..
일반적으로 트랜스폼은 블랜드에서 생성해서 쓰기 때문에 동적으로 생성할일이 많지는 않습니다. 하지만 동적으로 생성한 컨트롤에 트랜스폼을 주고 싶으면 동적으로 생성해야 하죠. 동적으로 트랜스폼을 주려면 2가지 방법이 있습니다. 한개만 지정하는 방법과 그룹으로 지정하는 방법이 있죠. 1개만 지정하는 방법은 컴포짓트랜스폼(CompositeTransform)을 이용합니다. 이 컴포짓트랜스폼은 4.0이후버전에서 사용하는데....이전 버전에서 사용가능한지 모르겠군요. 어찌됬건 컴포짓트랜스폼은 좌표이외에도 대부분의 트랜스폼 옵션을 사용할수 있기때문에 거의 컴포짓트랜스폼만 생성하면 별문제 없이 애니메이션 생성이 가능하죠. 이 포스팅에선 4.0이후 버전에서 1개만 지정하여 사용하는 방법을 알려드리겠습니다. 1개만 지정한개..
WPF나 실버라이트를 하면서 가장 아리송한 부분이 색지정입니다. 특히 배경색 말이죠. 보통 윈폼에서는 칼라나 RGB열거형을 쓰는데 WPF나 실버라이트는 브러쉬라는 것을 사용합니다. 브러쉬는 사용하는건 별문제가 안되는데 이녀석도 객체처럼 초기화를 하려고 하면 초기화가 안됩니다 ㅡ,.ㅡ; 헛 에러가-_-;; 비주얼 스트디오의 친절함에 익숙한 닷넷 개발자들이라면 적지않게 당황할수 밖에 없는 상황이죠 ㅎㅎㅎ 어지됬건 각 브러쉬에 맞는 브러쉬로 초기화를 해야 먹힙니다, 위와 같은 백그라운드의 경우 SolidColorBrush를 이용해야 합니다. LayoutRoot.Background = new SolidColorBrush(Colors.Red); LayoutRoot.Background = new SolidColor..