본문 바로가기

Development Experience/C#

(20)
C# log4net을 XML 대신 코드로 사용하기 Java에 log4j 라는 오픈소스 로깅 라이브러리가 있듯이 C#에는 log4net 이라는 라이브러리가 있다. log4net의 일반적인 사용법은 XML 파일에 log4net 관련 설정을 한 후, 이 파일을 log4net의 XmlConfigurator.Configure() 함수로 등록하면 된다. 나는 지금까지 이 작업을 App.xaml.cs 파일에서 수행해왔다. 하지만 세상에 편한 일만 있을 순 없는 법.. 내가 회사에서 만들고 있는 비디오 스트리밍 프로그램은 하나의 메인 프로그램이 있고, 1 ~ 25 개의 카메라 영상을 스트리밍 해주는 각각의 스트리밍 프로그램이 있다. 즉, 프로젝트는 하나인데 프로세스는 여러개가 실행되는 구조이고 각각은 자신들만의 로그 파일을 가지고 있어야 했다. 문제는 여기서 발생한다..
Winform UI Component의 Dock 스타일 적용이 잘 안 될 경우 Winform UI를 구성하면서 Dock 스타일을 적용시킬 때, UI Component들끼리 서로 겹치는 경우가 있다. 이 경우 Visual Studio Designer에서 해당 UI Component를 오른쪽 클릭하여 Bring To Front를 선택하면 Dock 스타일을 겹치지 않게 적용시킬 수 있다.
트리 구조의 DataSource를 두 UI 컴포넌트에 연결할 때 회사 프로젝트를 수행하던 중 트리 구조의 자료 구조에서 depth 1의 노드들 따로, depth 2의 노드들 따로 두 개의 UI 컴포넌트에 각각 바인딩할 일이 있었다. 나는 별 고민없이 DropDownList 의 DataSource에 depth 1의 노드들을 바인딩하였고, GridView의 dataSource에는 depth 2의 노드들을 바인딩하였다. depth 1 의 노드들과 depth 2의 노드들은 모두 한 Instance 안에 존재하였다. 초반엔 문제가 없었는데, GridView의 DataSource만 따로 조작해야 할 상황이 생기자 문제가 발생하였다. 나는 GridView에서만 Refresh를 하고 싶었는데, depth 2의 노드들을 Refresh 하고 나니 DropDownList에 바인딩되었던 ..
C# Winform DropDownList의 SelectedIndex 이벤트 관리 (Telerik 사용) C# Winform을 사용한 프로젝트에서 DropDownList의 SelectedIndex 이벤트를 상황에 맞게 조절해야 할 필요성이 있었다. 사용자가 DropDownList 에서 현재 선택된 아이템이 아닌 다른 아이템을 선택할 경우, 기존 데이터가 지워진다는 메시지 팝업을 띄워주어야 했다. 처음엔 기존에 사용하던 SelectedIndexChanged 이벤트 핸들러에서 이 메시지 팝업을 띄워주려 했다. 하지만 여기서 팝업을 띄우다보니, 사용자가 기존 데이터를 지우고 싶어하지 않는 경우에도 DropDownList의 Index가 바뀌어 버리는 것이었다. SelectedIndex 이벤트가 실행되는 걸 멈추기 위해 argument로 받은 이벤트 변수 e 의 e.Cancel을 true로 하고자 했으나 Cancel..
WPF Window 창이 작업 표시줄 (Task bar) 을 덮는다면.. WPF에서 Window 창이 작업 표시줄을 덮어버리는 현상이 발생하였다. 특정 모니터에서만 그랬는데, 나는 이 이슈가 MaxHeight를 제대로 설정해주지 않아서 발생한 것이라 생각했다. 그래서 this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight; 라는 구문을 View의 Load() 함수 내부에서 선언해주었지만 문제는 해결되지 않았다. 30분쯤 흐른 후 내가 깨달은 건, 이 문제의 원인이 MaxHeight가 아니라 MinHeight 였다는 것이었다. MinHeight = "1100" 으로 잡았었는데, 이 Height가 1920 * 1200 해상도에서는 정상적으로 보였지만 1920 * 1080 해상도에서는 1080이 1100 보다 작으므로 작업 ..
C#, WPF 창이 중복으로 뜬다면.. EventHandler를 의심하라 C#, WPF 개발 도중 팝업을 띄우는 기능을 쓸 일이 있었다. 어떤 설정을 하는 SettingWindow를 띄우고, 세팅 도중 올바른 설정이 아니면 Popup 창을 띄워서 오류를 지적해주는 기능이었다. 그런데 어느 순간부터 올바른 설정이 아닐 때 Popup 창이 중복으로 여러번 띄워지는 에러가 나고 있음을 발견하였다. 난 분명 한번만 Popup 창을 띄워서 사용자에게 잘못된 설정을 인지시키고 리턴하도록 코드를 짰는데... 30분정도 헤메다 원인을 찾았다. 실마리는, Popup 창이 중복으로 띄워지는 횟수가 SettingWindow를 몇 번 띄웠는지와 정비례하게 증가한다는 사실이었다. 즉 사용자가 무언가 설정할 필요가 있어서 SettingWindow를 띄우고 이것저것 설정하는 시나리오를 생각해보자. 사용..
WPF TreeView Header 클릭 안될 때 WPF TreeView를 사용하면서 TreeViewItem의 Text 부분(Header)을 클릭했을 때 Click 이벤트가 발생되지 않는 현상을 발견하였다. 원인은 내가 짠 코드에 있었는데, 안에 를 또 선언해서 작성했던 게 원인이었다. 내부에서 ItemTemplate 을 삭제하니 잘 클릭되었다.
WPF C# Button Command in DataTemplate (바인딩이 안될때..) DataTemplate 안에 선언된 Button의 경우 Command를 그냥 바인딩하면 바인딩이 안된다. Command가 부모의 DataContext에 존재하기 때문이다. 그래서 Command를 찾기 위한 대상을 변경해주어야 한다. 즉 정리해보면, 평소라면 위와 같이 선언했겠지만 DataTemplate 내부에 Button이 존재한다면 위와 같이 선언해야한다. 혹은 좀 더 간결하게 하기 위해