일반적인 파일 경로에서 WildCard를 적용하여 파일을 찾는 방법은 .NET에 기본적으로 구현되어 있다. string[] fileNames = Directory.GetFiles(@"C:\Users\Me\Documents", "*.docx"); 하지만 실제 경로가 아닌, 단순히 파일명만 있는 상황이라면? 순수 문자열에 대한 WildCard를 적용해야 할 것이다. codeproject에 예제가 있어서 정리 해둔다. public static class StringExtension { public static bool IsMatchByPattern(this string src, string pattern, bool ignoreCare = false) { if (string.IsNullOrWhiteSpace(p..
DWM(Desktop Window Manager)를 통하여 TitleBar에 DarkMode를 적용할 수 있다. 1. 적용 전 2. 적용 후 public class DWM { private const int DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19; private const int DWMWA_USE_IMMERSIVE_DARK_MODE = 20; [DllImport("dwmapi.dll")] [EditorBrowsable(EditorBrowsableState.Never)] public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); priv..
일단, .NET Framework 기반의 WinForm을 .NET 5로 마이그레이션 하는 방법은 MS의 공식문서로 존재한다. 이 포스팅은 기본적으로 MS의 공식문서 가이드를 따라 간다. .NET 5로 마이그레이션 후 기존 UI와 조금씩 틀어지는 부분이 발생하였고, 이부분은 어쩔 수 없이 개인이 하나씩 확인하며 수정해야 할 듯 싶다. (Windows Forms 데스크톱 앱을 .NET 5로 마이그레이션하는 방법) [ 마이그레이션 과정 ] 0. 준비 1) VisualStudio 2019 2) 프로젝트 백업 1. packages.config 1) 솔루션 탐색기에서 packages.config을 검색 2) packages.config 파일 우클릭 > PackageReference로 마이그레이션 3) 솔루션내 모든..
이 기능은 정확히 말하면 버그는 아니지만, 공공연하게 버그 취급되는 기능이다. 그 이유는 이 기능이 도입된 히스토리를 보면 된다. Windows Vista 시절 어느 윈도우 셸 프로그래머가 도입한 기능이다. 해당 개발자는 이 기능에 대한 어떠한 보고도 없이 적용 했다. 당연히 .NET Framework 개발팀에서는 해당 기능에 대해 누구도 인지하지 못 한 상태였다. 시간이 흐른 후 Windows 7 시절 누군가 이슈로 문의를 한 후에야 알아차렸지만.. 이미 해당 기능이 릴리즈된 후 수 많은 결과물이 나왔을 것이므로, 수정하지 못했다. 아직까지 MS는 공식 Fix버전이나 해당 기능을 On/Off하는 Property를 도입하지 않고 있다. 당연하게도 개발자들의 원성은 자자했고, 스스로 해결법을 찾아 내었다!..
List에 index로 서로의 위치를 변경하고자 할때 쓰인다. ex) Drag&Move로 아이템의 위치를 변경하고자 할때 C#에서 제공하는 함수는 없으며, 확장 메서드로 따로 구현 하여야 한다. public static class ExtensionList { public static void Swap(this List list, int from, int to) { T tmp = list[from]; list[from] = list[to]; list[to] = tmp; } }
Java에서는 기본적으로 지원하는 함수지만, C#에서는 확장메서드로 구현 해줘야 한다. public static class ExtensionList { private static Random _ran = new Random(); public static void Shuffle(this List list) { int to = list.Count; while (to > 1) { int from = _ran.Next(--to + 1); T tmp = list[from]; list[from] = list[to]; list[to] = tmp; } } }
C#에는 오디오 파일을 재생하기 위한 최고의 라이버르리가 존재한다. 사운드 Input부터 믹싱까지 다양한 기능이 있지만, 이 글에서는 단순 오디오 파일의 재생만 다룬다. 1. NuGet에서 NAudio를 검색하여 아래 스크린샷에 체크한 2개를 다운 받는다. - NAudio.Vorbis는 NAudio를 Fork하여 파생된 프로젝트로, 기존 NAudio에서 지원하지 않는 형식인 .oga와 .ogg 파일의 재생을 위해 만들어진 프로젝트다. 2. Player의 재생은 개별 Thread로 해야하며, NAudio 공식 샘플은 async/await로 되어 있다. 이 글에서는 BackgroundWorker로 구현한 코드를 올린다. - 구버전의 NAudio의 경우, 파일에 따라 그에 맞는 WaveStream을 써야 한다..
일반적인 GUI Application과 동일하게 Winform 또한 UI Thread가 MainThread 역할을 하며, 해당 Thread는 SingleThread 방식으로 돌아간다. UI Thread는 기본적으로 Loop를 돌면서 MessageQueue에 담긴 Message를 가져오고, Handler에 전달하는 역할을 한다. 이때 Handler에서 딜레이가 오래 발생할 경우 MessageQueue에 담긴 다음 Message를 실행하지 못하므로, UI 프리징 현상이 발생 한다. 이러한 UI 프리징 현상을 방지하기 위해 시간이 오래 걸리는 작업은 별도의 Thread를 생성하여 처리한 후 결과만 UI에 반영하도록 개발 해야한다. BackgroundWorker, Thread, Task, AsyncCallBac..
WCF의 Client 구현시 Service참조를 하면 Proxy코드가 자동 생성된다. 이때 ServiceClient코드도 자동 생성된다. ServiceClient는 ClientBase를 상속받으며, ClientBase는 IDisposable 인터페이스를 구현하였다. 그렇기 때문에 실제 ServiceClient는 아래와 같은 코드로 사용이 가능하다. (※ ServiceClient는 사용후 필히 Close() 처리를 해줘야 함) using (var client = new ServiceClient()) { client.Hello(); } using 블럭으로 감싼 ServiceClient는 ClientBase에서 구현된 Dispose 함수 내부에서 client.Close()를 호출해준다. 여기서 문제는.. cl..
(프로젝트 파일) * 2019.01.16 내용 수정 - Zoom 기능 추가 (본문 하단 스크린샷에는 없음) - 상단 프로젝트 파일을 최신내용 반영된 파일로 교체 GDI+와 Memento 패턴 공부를 위해 간단한 그림판 프로그램을 만들어 보았다. 1. GDI+ - PictureBox의 OnPaint 함수에서 Graphics를 이용한 그리기 - OnPaint에서 그리기 위해 MouseEvent에서의 정보 저장 - GDI+에 대한 이해 증가 2. Memento 패턴 - Undo/Redo Service를 만들기 위함 - 이미지 자체를 저장해도 되나, 리소스 낭비가 심함 - IMemento interface를 구현한 class에는 그리기에 필요한 정보만 저장 (Color, Path 등) - IMemento 리스트..
- Total
- Today
- Yesterday