반응형

프로그래밍 127

[C#] MessagePack-CSharp을 이용한 고성능 객체 직렬화 및 역직렬화

C#에서 객체를 직렬화 및 역직렬화하는 여러 가지 방법 중, 성능과 효율성 측면에서 뛰어난 MessagePack-CSharp에 대해 알아보겠습니다. MessagePack는 이진 형식을 사용하여 JSON보다 더 작은 크기와 더 빠른 처리 속도를 제공합니다. MessagePack-CSharp 라이브러리 설치 먼저, 프로젝트에 MessagePack-CSharp 라이브러리를 설치해야 합니다. NuGet 패키지 관리자를 사용하여 설치할 수 있습니다. 직렬화 및 역직렬화를 위한 클래스 준비 MessagePack를 사용하여 직렬화 및 역직렬화할 클래스에 [MessagePackObject] 특성을 추가하고, 모든 필드 또는 속성에 [Key] 특성을 지정합니다. using MessagePack; [MessagePackO..

프로그래밍/C# 2023.04.14

[WPF] 여러 Enum 상태에 따라 선택적으로 UserControl 표시하기

WPF에서 사용자 인터페이스를 개발하다 보면, 여러 상황에 따라 다양한 UserControl을 동적으로 표시해야 할 때가 있습니다. 이런 경우, Enum 상태에 따라 UserControl을 선택적으로 표시하는 방법을 사용할 수 있습니다. 이 이번 포스팅에서는 DataTemplate 및 DataTemplateSelector를 사용하여 여러 Enum 상태에 따라 UserControl을 표시하는 방법을 알아봅니다. 1. Enum 정의 public enum Status { First, Second, Third } 2. 각 상태에 대한 UserControl 정의 예를 들어, FirstControl.xaml, SecondControl.xaml, ThirdControl.xaml 파일을 각각 생성하여 다음과 같이 각 ..

프로그래밍/WPF 2023.04.12

[WPF] DataGrid에서 SelectedItems를 ViewModel과 바인딩하는 방법

오늘은 WPF DataGrid에서 선택된 항목들(SelectedItems)을 ViewModel과 바인딩하는 방법에 대해 알아보겠습니다. WPF의 DataGrid는 강력한 기능을 제공하지만, 선택된 항목들을 ViewModel에 직접 바인딩하는 기능은 제공하지 않습니다. 그러나 Blend SDK의 Behavior 클래스를 활용하여 이 문제를 해결할 수 있습니다. 먼저, DataGridSelectedItemsBehavior라는 이름의 새 클래스를 생성하고, 이 클래스를 Behavior로 상속합니다. public class DataGridSelectedItemsBehavior : Behavior { // ... } 다음으로, SelectedItems라는 DependencyProperty를 정의합니다. 이 프로퍼..

프로그래밍/WPF 2023.03.27

[C#] List<object>를 특정 클래스 타입의 List로 캐스팅하는 방법

오늘은 C#에서 List를 특정 클래스 타입의 List로 캐스팅하는 방법에 대해 알아보겠습니다. 가끔 우리는 List에 특정 클래스 타입의 객체만 포함되어 있다는 것을 알고 있지만, 이를 해당 클래스 타입의 List로 변환해야 하는 상황이 있습니다. 이 경우, LINQ를 사용하여 쉽게 캐스팅할 수 있습니다. 예를 들어, ImageData라는 클래스 타입의 객체만 포함된 List가 있다고 가정해봅시다. 이제 이 List를 List로 캐스팅하고자 합니다. 먼저, 필요한 네임스페이스를 추가합니다. using System.Collections.Generic; using System.Linq; 다음으로, 이미 존재하는 List를 List로 변환하기 위해 LINQ의 OfType 메서드를 사용합니다. List obj..

프로그래밍/C# 2023.03.27

[WPF] Converter를 이용한 Binding Image Source

일반적으로 Image 컨트롤에 Image의 Path를 string 형태로 바인딩하면 화면에 이미지가 나온다. 그러나 이렇게 되면 해당 이미지를 프로그램이 계속 점유하고 있게 된다. 간단한 예를 들어보자 한쪽에는 한 화면에 좌측은 이미지가 있고, 오른쪽은 ListView에 이미지들의 나온다고 하고, ListView에서 Image의 이름을 선택하면 좌측에 해당 이미지가 보여주는 프로그램이 있다고 하자. 일반적인 바인딩의 경우 아래와 같이 할것이다. 선택한 이미지를 ImagePath라는 string에 바인딩 처리하여 Display할 것이다. 그런데 사용자는 Delete key를 통해 ListView에 있는 이미지를 삭제하고, 실제 경로에 있는 파일까지 삭제한다고 하면 아래와 같은 예외가 튀어나올 것이다. 파일..

프로그래밍/WPF 2023.03.23

[C++] Convert from 3 Byte RGB color to 2 Byte RGB color

보통 컬러에 사용할 때, 0xFFFFFF -> RGB를 각각 1byte 씩 매칭하여 사용된다. 그러나 tft lcd 를 arduino 같은 플랫폼에서 사용할 때는 3 byte가 아닌 2 byte 형태로 축소하여 Color를 표현하기도 하는데 이것을 위한 컬러 변환 하는 방법은 아래와 같다. unsigned long rgb = strtol(hex_code.c_str(), NULL, 16); // 3byte에서 각각의 R, G, B 값을 추출합니다. byte red = (rgb >> 16) & 0xff; byte green = (rgb >> 8) & 0xff; byte blue = rgb & 0xff; // 각각의 값을 2byte 형태로 변환합니다. byte r_2byte = map(red, 0, 255, ..

프로그래밍/IoT 2023.03.10

[오류해결] Brush - DependencyObject와 같은 스레드에서 DependencySource를 만들어야 합니다.

WPF에서 Json으로 직렬화와 역직렬화하여 화면에 디스플레이 하다가 UI Thread에선 문제가 없었는데, Task를 태워서 비동기 처리를 하려다 보니 아래와 같은 오류가 발생되었다. DependencyObject와 같은 스레드에서 DependencySource를 만들어야 합니다. 처음엔 이게 뭐야??? 하면서 내가 사용한 객체들에 대해 뒤져보게 되었다. 일단 DependencyObject가 같은 Thread에서 나와야 한다는것이 일단 Dispatcher를 이용하면 될것이라는 것은 명확했다. 하지만 어느 부분에서?? 라는 것이 문제였다. 워낙 많은 양의 데이터를 역직렬화하다보니 전체를 감싸기도 애매했다. 그래서 객체에 담긴 모든 데이터를 다 확인해보기 시작했다. 뭐 결론은 Brush다. https://..

프로그래밍/WPF 2022.12.21

[WPF] Close popup when mouse leave

Popup에서 StaysOpen을 False로 두면 해당 팝업 컨트롤에서 포커스를 잃으면 알아서 닫힌다. 근데 포커스를 잃을려면 마우스를 누르거나 다양한 방법으로 상호작용을 해야하는데 이것마저 해서는 안되는 경우가 종종있다. 나의 경우는 그냥 팝업 화면에서 마우스만 빠져나가도 팝업이 닫게 하고 싶었다. Behind Code로 작성하면 편하겠지만 MVVM 패턴으론 쉽게하기 어려우니 Behavior를 쓰기로 했다. 일단 Behavior Class를 만들어준다. class ClosePopupBehavior : Behavior { protected override void OnAttached() { AssociatedObject.Child.MouseLeave += Child_MouseLeave; } privat..

프로그래밍/WPF 2022.12.20

[C#] Class & Struct Performance Test

c#에서 사람들은 너무 무자비하게 Class만 사용한다. 하지만 실제 성능은 어떨까? stack과 heap의 차이라 너무 명백한 성능을 차이를 보이지만 똥인지 된장인지 찍어먹어봐야 아는 사람들이 있으니 이것을 보고 주니어를 졸업하도록 하자. https://mdfarragher.medium.com/whats-faster-in-c-a-struct-or-a-class-99e4761a7b76 What Is Faster In C#: A Struct Or A Class? What do you think is faster: filling an array with one million structs, or filling an array with one million classes? mdfarragher.medium.c..

프로그래밍/C# 2022.12.13

[WPF] Binding SelectedItems (ItemsControl, DataGrid 등)

ItemsControl이나 DataGrid 등의 List형 데이터를 Source로 가지는 컨트롤들은 Code behind에서 SelectedItems에 접근할 수 있다. 하지만 Xaml 에서 접근하려고 한다면 SelectedItem 만 접근 가능하다. 자. 이제부터 문제의 시작이다. MVVM 패턴에서 직관적으로 접근하려고 한다면 SelectedItem밖에 Binding 못한다. 하지만 여러개의 Row를 선택하고, 이러한 Row를 이용하여 어떠한 작업을 하려면 다른 방법을 써야한다. DataGrid를 예를 들어 설명하도록 하겠다. Xaml ViewModel // Multi Selection이 발생됬을때 받아올 Property 선언 public List SelectedItems { get; set; } = ..

프로그래밍/WPF 2022.12.07
반응형