'wpf'에 해당되는 글 31건

  1. 2025.01.07 listbox에서 터치스크롤시 화면 전체가 움직일떄
  2. 2023.06.09 [WPF] 체크박스 xName을 이용하여 반복작업 하지 않고 간결하게
  3. 2023.06.08 MEF란?
  4. 2023.06.07 [WPF] gRPC Client 빌드 안될때 대처법
  5. 2022.12.05 dynamic property 에서 Set을 할떄
  6. 2022.10.26 public (string name, int age) GetUser()
  7. 2022.08.31 PeriodicTimer
  8. 2021.11.18 2개의 LIST 비교 하는것
  9. 2021.08.24 싱글톤 쓰기
  10. 2021.05.06 Combox 에 Enum 바인딩
  11. 2020.04.28 WPF에서 기본적으로 제공해주는 BoolToVisConverter 컨버터
  12. 2020.03.06 WPF TabControl에서 SelectionChanged가 계속 호출되는 문제
  13. 2019.04.24 이벤트 중복 호출 되지 않게 하는법
  14. 2019.03.21 list depp copy , clone 하는 간단한 방법
  15. 2019.02.26 OpenCV, Face API를 이용해서 얼굴 검출하기 2번째
  16. 2019.02.25 Face API를 이용하여 얼굴 검색 및 비교해서 동일인 찾기
  17. 2017.10.19 wpf FlipView
  18. 2017.09.12 Listview , Button MouseOver, Selcted Color 제거
  19. 2017.09.06 Converter를 쓰지 않고 바인딩된 TextBlock에 글자를 추가하고 싶을때
  20. 2017.08.22 LIST의 UI에 즉각적으로 바인딩 업데이트를 하고 싶을때..
  21. 2017.08.08 MVVM 하위 컨트롤 바인딩
  22. 2017.08.08 ViewModel 끼리의 통신
  23. 2017.08.07 해상도에 따른 이미지 크기 변경
  24. 2017.07.25 CommandParameter를 이용하여 List 안에 버튼 파라미터 전달
  25. 2017.07.24 List Object를 Copy 해보자. (ICloneable)
  26. 2017.07.21 non-ASCII를 없애보자.
  27. 2017.07.21 Base 모델 클래스에 있는 데이터를 상속 클래스에 COPY 하기
  28. 2017.07.18 listbox에서 오른쪽 정렬하고 싶을때
  29. 2017.07.17 [WPF] NavagionManager
  30. 2017.07.17 MVVM Button Click Command 사용법
wpf2025. 1. 7. 11:35

listbox에 ManipulationBoundaryFeedback 이벤트를 설정하여

 

behind에서

e.Handled = true;

를 한다.

Posted by 동동(이재동)
wpf2023. 6. 9. 18:37

 private void MessageCheck_Checked(object sender, RoutedEventArgs e)
        {
            if (IsLoaded == false)
                return;

            var name = (sender as ToggleButton).Name;

            var ctl = xGroups.FindName(name) as ToggleButton;

            DataManager.LocalData.MessageSelect.GetType().GetProperty(name.Remove(0, 1)).SetValue(DataManager.LocalData.MessageSelect, ctl.IsChecked);

            DataManager.Instance.SaveData();
        }

        private void TelegramMessageSelectPage_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if ((e.NewValue) as bool? == false)
                return;

            foreach (var item in DataManager.LocalData.MessageSelect.GetType().GetProperties())
            {
                var ctl = xGroups.FindName($"x{item.Name}") as ToggleButton;

                if (ctl != null)
                    ctl.IsChecked = (bool)item.GetValue(DataManager.LocalData.MessageSelect);
            }
        }

 

 public class MessageSelectModel
    {
        public bool IsDeepSleep { get; set; }

        public bool IsStartEndMap { get; set; }

        public bool IsDriveEnd { get; set; }
    }

 

 

 

그냥 바인딩하는게 최고지만 피지 못할경우에는 

 xIsAutoAfterBlowBtn.IsChecked = DataManager.LocalData.IsAutoAfterBlow; <-이런식으로 노가다 작업하지말고

 

xName이랑 프로퍼티랑 이름을 같게해서 반복작업을 줄여보자

Posted by 동동(이재동)
wpf2023. 6. 8. 14:50

https://blog.powerumc.kr/189

 

[MEF] 1. Managed Extensibility Framework 이란?

MEF (Managed Extensibility Framework) 란? Menaged Extension Framewkr(이하 MEF) 란? 가장 쉽게 얘기하자면, 어플리케이션과 컴포넌트의 재사용성을 높일 수 있는 프레임워크입니다. 기존의 어플리케이션은 하나

blog.powerumc.kr

 

여기에 잘정리 되어 있으니 보자..

 

Menaged Extension Framewkr(이하 MEF) 란? 가장 쉽게 얘기하자면, 어플리케이션과 컴포넌트의 재사용성을 높일 수 있는 프레임워크입니다. 기존의 어플리케이션은 하나의 목적을 하나의 어플리케이션으로 구현한 정적인(Statically) 어플리케이션이라면, MEF 는 보다 동적인(Dynamically) 어플리케이션을 구축할 수 있는 새로운 라이브러리를 제공합니다.

Posted by 동동(이재동)
wpf2023. 6. 7. 15:25

서버야 프로젝트 템플릿이 있어서 그냥 자동으로 만들어지지만

WPF client에서 Protos에 greet.proto를 복사하고 따라했지만 빌드에러가 났다..

 

구글 검색후 해결했다

 

https://stackoverflow.com/questions/60810497/grpc-erros-in-wpf-net-core

 

gRPC erros in WPF .NET Core

I want to create a simple WPF Core, gRPC project. This "code" works perfectly in my .NET Core Console app, however WPF seems to be something special. Proto File syntax = "proto3"...

stackoverflow.com

 

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net6.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <CoreCompileDependsOn>$(CoreCompileDependsOn);Protobuf_Compile</CoreCompileDependsOn>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.23.2" />
    <PackageReference Include="Grpc.Net.Client" Version="2.53.0" />
    <PackageReference Include="Grpc.Tools" Version="2.54.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
    
  </ItemGroup>

</Project>

 

프로젝트 편집에서

 

<CoreCompileDependsOn>$(CoreCompileDependsOn);Protobuf_Compile</CoreCompileDependsOn>

이걸 추가함으로써 빌드가 되었다.

 

 

'wpf' 카테고리의 다른 글

[WPF] 체크박스 xName을 이용하여 반복작업 하지 않고 간결하게  (0) 2023.06.09
MEF란?  (0) 2023.06.08
dynamic property 에서 Set을 할떄  (0) 2022.12.05
public (string name, int age) GetUser()  (0) 2022.10.26
PeriodicTimer  (0) 2022.08.31
Posted by 동동(이재동)
wpf2022. 12. 5. 11:44

await SendConfirmMsg(msgSplit, DataManager.LocalData.LongTrendBuy, "QuitRange");

 

 

 

private static async Task SendConfirmMsg(string[] msgSplit, dynamic data, string prop)
        {
            double numValue;
            bool isNum = double.TryParse(msgSplit[2], out numValue);

            data.GetType().GetProperty(prop).SetValue(data, numValue, null);           

            DataManager.Instance.SaveData();
            await TelegramPushService.SendMessage($"{msgSplit[0]} {msgSplit[1]} {numValue}");
        }

 

 

이런식으로 반복되는 구문을 dynamic을 이용해서 짧게 만들수 있다.

 

중요

 

data.GetType().GetProperty(prop).SetValue(data, numValue, null);   

 

참고

https://stackoverflow.com/questions/12970353/c-sharp-dynamically-set-property

'wpf' 카테고리의 다른 글

MEF란?  (0) 2023.06.08
[WPF] gRPC Client 빌드 안될때 대처법  (0) 2023.06.07
public (string name, int age) GetUser()  (0) 2022.10.26
PeriodicTimer  (0) 2022.08.31
2개의 LIST 비교 하는것  (0) 2021.11.18
Posted by 동동(이재동)
wpf2022. 10. 26. 15:34

Tuple 대신에 이렇게 사용할수도 있다 엄청 편리할듯

 

public (string name, int age) GetUser()
        {
            return ("이름", 30);
        }

'wpf' 카테고리의 다른 글

[WPF] gRPC Client 빌드 안될때 대처법  (0) 2023.06.07
dynamic property 에서 Set을 할떄  (0) 2022.12.05
PeriodicTimer  (0) 2022.08.31
2개의 LIST 비교 하는것  (0) 2021.11.18
싱글톤 쓰기  (0) 2021.08.24
Posted by 동동(이재동)
wpf2022. 8. 31. 16:03

PeriodicTimer는 비동기 방식으로 타이머 틱을 처리하는 최신 타이머 API 입니다. 다음처럼 사용할 수 있고요,

var timer = new PeriodicTimer(TimeSpan.FromSeconds(1));

while (await timer.WaitForNextTickAsync())
{
    Console.WriteLine(DateTime.Now);
}

1초 간격으로 실행되는 결과를 확인할 수 있습니다.

| 실행 결과

2021-11-18 오후 11:14:17
2021-11-18 오후 11:14:18
2021-11-18 오후 11:14:19
2021-11-18 오후 11:14:20
2021-11-18 오후 11:14:21

얼핏 보면 Task.Delay()의 기능과 별반 차이가 없어 보이죠? 차이가 있습니다. 다음의 코드를 보시죠.

var timer = new PeriodicTimer(TimeSpan.FromSeconds(2));

while (await timer.WaitForNextTickAsync())
{
    Console.WriteLine($"Wake Up!: {DateTime.Now}");

    // 1500 ms 소요되는 처리가 발생했다고 가정
    Thread.Sleep(1500);
}

| 실행 결과

Wake Up!: 2021-11-18 오후 11:18:56
Wake Up!: 2021-11-18 오후 11:18:58
Wake Up!: 2021-11-18 오후 11:19:00
Wake Up!: 2021-11-18 오후 11:19:02
Wake Up!: 2021-11-18 오후 11:19:04

강제로 1500 ms 만큼의 딜레이를 줬음에도 불구하고 지정한 period 만큼의 타이머 틱을 제공합니다.

타이머 동작 중 취소하는 기능이 있을까요? WaitForNextTickAsync(cancellationToken)를 통해 취소도 가능합니다. 하지만 좀 더 쉽게 취소하는 방법은 timer를 Dispose하는 것입니다.

'wpf' 카테고리의 다른 글

dynamic property 에서 Set을 할떄  (0) 2022.12.05
public (string name, int age) GetUser()  (0) 2022.10.26
2개의 LIST 비교 하는것  (0) 2021.11.18
싱글톤 쓰기  (0) 2021.08.24
Combox 에 Enum 바인딩  (0) 2021.05.06
Posted by 동동(이재동)
wpf2021. 11. 18. 18:01

private bool IsDiffList<T>(List<T> list1, List<T> list2)
        {
            var diff1 = list1.Except(list2);
            var diff2 = list2.Except(list1);

            var resultDiff = diff1.Concat(diff2).ToList();

            if (resultDiff.Count > 0)
                return true;
            else
                return false;
        }

 

if (IsDiffList<OrderInfo>((xProfitOrderListbox.ItemsSource as List<OrderInfo>).ToList(), _service.OrderInfoList))
                {
                    xProfitOrderListbox.ItemsSource = _service.OrderInfoList;
                    xProfitOrderListbox.Items.Refresh();
                }

 

이런식으로 반복적으로 item을 넣어야 하는곳에 넣어준다. timer를 이용하면 객체를 계속 생성하기때문에

 

무조건 넣어주면 메모리 Leak 이 걸린다. 그렇기 떄문에 변경될때만 적용되게 해야한다.

'wpf' 카테고리의 다른 글

public (string name, int age) GetUser()  (0) 2022.10.26
PeriodicTimer  (0) 2022.08.31
싱글톤 쓰기  (0) 2021.08.24
Combox 에 Enum 바인딩  (0) 2021.05.06
WPF에서 기본적으로 제공해주는 BoolToVisConverter 컨버터  (0) 2020.04.28
Posted by 동동(이재동)
wpf2021. 8. 24. 12:13

 public abstract class Singleton<T> where T : class
    {
        private static readonly Lazy<T> LazyInstance =
            new Lazy<T>(CreateInstanceOfT, LazyThreadSafetyMode.ExecutionAndPublication);

        public static T Instance
        {
            get
            {
                return Singleton<T>.LazyInstance.Value;
            }
        }

        private static T CreateInstanceOfT()
        {
            return Activator.CreateInstance(typeof(T), true) as T;
        }
    }

 

출처 : http://egloos.zum.com/sweeper/v/3157853

Posted by 동동(이재동)
wpf2021. 5. 6. 18:31

 

출처 stackoverflow.com/questions/58743/databinding-an-enum-property-to-a-combobox-in-wpf

Posted by 동동(이재동)
wpf2020. 4. 28. 12:39

Converter={StaticResource BoolToVisConverter}

 

 

단 App.xaml에

<BooleanToVisibilityConverter x:Key="BoolToVisConverter" />

를 추가해야한다.

 

구지 안만들어도 된다 ㅋ

Posted by 동동(이재동)
wpf2020. 3. 6. 17:53

WPF에서 텝이 변결될 때 발생하는 이벤트 키워드인 SelectionChanged를 TabControl에 사용해서 탭을 가져오는 형태로 코드구성을 진행하는 중 이상한 점이 발견됬다.

내가 만드는 프로그램에서는 2번째 탭을 클릭하면 SelectionChanged가 호출 되고 2번째 탭 내의 ListBox 컨텐츠가 업데이트 되는 형식으로 코드가 진행될 것으로 예상하고 디버그를 하였으나, 실제로는 2번째 탭을 클릭하면 SelectionChanged가 재귀적으로 무한호출 되버리는 문제가 발생되었다.

문제는 TabControl 내부에 컨텐츠가 업데이트 되거나 무슨 변화가 존재할 경우에도 해당 이벤트가 호출된다는 점이다. 이럴 대는 Source 값이 TabControl인지 비교하는 항목이 추가되야 하며 아래와 같은 코드구성이 가능하다.

private void MainTabChanged(object sender, SelectionChangedEventArgs e)
{
int tabItem = ((sender as TabControl)).SelectedIndex;
if (e.Source is TabControl) // This is a soultion of those problem.
{
switch (tabItem)
{
case 0: // Chatting
Debug.WriteLine("Tab: Chatting");
if (MainChatList.Items.Count > 0)
{
MainChatList.SelectedIndex = MainChatList.Items.Count - 1;
MainChatList.ScrollIntoView(MainChatList.Items[MainChatList.Items.Count - 1]);
}
break;
case 1: // Users
Debug.WriteLine("Tab: Users");
break;
case 2: // Friends
Debug.WriteLine("Tab: Friends");
this.OnFriendTabActive();
break;
default:
Debug.WriteLine("Tab: " + tabItem);
break;
}
}
}

 

소스의 4번째 줄을 확인하면 TabControl의 문제점을 개선하는 코드를 확인 할 수 있다.

 

 

if (e.Source is TabControl)<--로 확인가능

Posted by 동동(이재동)
wpf2019. 4. 24. 12:33


        public static event EventHandler MainPageMessageEvent
        {
            add
            {
                if (_mainPageMessageEvent == null || _mainPageMessageEvent.GetInvocationList().Count() == 0)
                    _mainPageMessageEvent += value;
            }

            remove
            {
                _mainPageMessageEvent -= value;
            }
        }

 

 

 

Posted by 동동(이재동)
wpf2019. 3. 21. 17:44

List를 그대로 대입시켜버리면 해당 객체가 바뀌기때문에


clone, deep copy를 해야한다.


List<Book> books_2 = books_1.ConvertAll(book => new Book());



내가 봤을때는 이게 가장 나은 방법같다.

https://stackoverflow.com/questions/14007405/how-create-a-new-deep-copy-clone-of-a-listt

Posted by 동동(이재동)
wpf2019. 2. 26. 16:56

얼굴 인식 2번쨰

Face API를 항상 호출하면 1분에 20번(무료 버전 기준) 호출 제한을 넘기때문에

일단 openCV 에서 얼굴을 최대한 감지한후 호출을 해야 호출 제한에 어느정도 자유롭다.

일단 openCVSharp을 설치하면

CascadeClassifier class의 DetactMultiScale을 이용해서 사람 얼굴을 감지할수 있다.

private readonly CascadeClassifier _localFaceDetector = new CascadeClassifier();
_localFaceDetector.Load("Data/haarcascade_frontalface_alt.xml");

_grabber.NewFrameProvided += (s, e) =>
{
var rects = _localFaceDetector.DetectMultiScale(e.Frame.Image, 1.3, 1, 0, new OpenCvSharp.Size(200, 200));
.
.
//Face API를 이용해서 얼굴 찾기

이런식으로 1차적으로 openCV 얼굴 검출 2차 Face API를 이용해서 얼굴 찾기 하면 된다.

프레임별로 얼굴을 찾는 부분을 호출 하기 때문에 2초 정도 안에는 다시 FaceAPI를 호출하지 못하도록 구현해야한다.


DetectMultiScale을 이용해서 검출할수 있는 최대 인원 및 최소 사이즈를 설정할수 있다. 샘플에서는 얼굴 크기가 200 이상인사람만 찾도록 구현했다.

샘플은 웹캠이 구동되고 얼굴을 비추면 첨보는 사람면 등록을 , 등록된 사람이면 userData의 이름 및 성별등등을 출력해준다. Face API는 최대한 호출되지 않도록 openCV에서 얼굴이 완전히 검출 되었을때만 사용했다.


FaceApiTest2.zip













Posted by 동동(이재동)
wpf2019. 2. 25. 15:34

  Face api 1.0 


https://westus.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395250

face api를 사용하기 위해선 face api를 사용하기 위한 key와 End Point를 받아야 한다.

end point는 이런식으로 되어 있다.
https://koreacentral.api.cognitive.microsoft.com/face/v1.0/

나머지는 api 사용법대로 사용 하면 된다.


openCV를 이용해서 카메라를 띄우고 FrameGrabber를 이용해서 해당이미지 사진을 올린다.

원리는 이렇다

FaceDetect를 이용해서 사람을 찾고 찾을경우 Find similer를 이용하여 FaceList에서 검색한다.

만약 없을경우 add Face를 이용하여 사람을 등록한다. 그룹을 이용해서 할수도 있다.

나머진 샘플을 이용해보자


FaceApiTest.zip


Posted by 동동(이재동)
wpf2017. 10. 19. 16:27

https://www.codeproject.com/Articles/741026/WPF-FlipView


나중에 정리

Posted by 동동(이재동)
wpf2017. 9. 12. 12:40

listview
1
2
3
4
5
6
7
8
9
10
11
12
                <ListView.ItemContainerStyle>
                    <Style TargetType="{x:Type ListViewItem}">
                        <Setter Property="Background" Value="Transparent" />
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ListViewItem}">
                                    <ContentPresenter />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListView.ItemContainerStyle>


button


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Background" Value="Transparent"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type Button}">
                                <Border Background="{TemplateBinding Background}">
                                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
</Button.Style>


Posted by 동동(이재동)
wpf2017. 9. 6. 12:13

예를 들면 3이라는 숫자가 바인딩 되어 있고

이걸 3개월로 바꾸고 싶으면 Converter를 쓰면 되지만 일일이 만들기가 엄청 귀찮다


 <TextBlock Text="{Binding Month, StringFormat={}{0}개월}"/>


돈도 

<TextBlock Text="{Binding Money,StringFormat='##,#'}" />


이렇게 하면 300,000 형식으로 나온다.



Posted by 동동(이재동)
wpf2017. 8. 22. 12:41

물론 ViewModel에서는 MVVM Light 라이브러리에 있는 NotifyProperty가 알아서 해주겠지만


Model 같은경우는 자기가 만들면 된다.


에를 들면 ObservableCollection에서 어떤 Property를 수정하였을때 즉각적으로 바인딩된 UI에 적용하고 싶다면


Model에 INotifyPropertyChanged 인터페이스를 구축하면 된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public class OrderedMenuItem : INotifyPropertyChanged
    {
        public int Index { get; set; }
 
        private int _orderCount;
 
        public int OrderCount
        {
            get { return _orderCount; }
            set
            {
                if (_orderCount != value)
                {
                    _orderCount = value;
                    NotifyPropertyChanged("OrderCount");
                }
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
 
        public void NotifyPropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(thisnew PropertyChangedEventArgs(propName));
        }
    }


참고 : http://www.wpf-tutorial.com/data-binding/responding-to-changes/


Posted by 동동(이재동)
wpf2017. 8. 8. 16:18

예를들어 View의 UserControl의 DataContext에 데이터를 주입하고

 <local:CardCancelControl DataContext="{Binding CardCancelData}" />


이런식으로...

유저컨트롤에서 버튼 커맨드를 넣었을때


 <Button Content="확인" Command="{Binding DataContext.CardCancelCommand}"  CommandParameter="Cancel" />


이런식으로 넣으면 안된다. datacontext안에 서 command를 호출하기 때문이다


이렇게 할려면 상위에서 DataContext를 빼야 작동한다.


그러면 상위에서 호출되게 할려면 어떻게 해야할까.


 <Button Content="확인" Command="{Binding Path=DataContext.CardCancelCommand,

                        RelativeSource={RelativeSource Mode=FindAncestor,

                        AncestorType={x:Type local:PopupControl}}}" CommandParameter="Cancel" />


이렇게 하면 된다.

참고 : https://stackoverflow.com/questions/3404707/access-parent-datacontext-from-datatemplate


Posted by 동동(이재동)
wpf2017. 8. 8. 15:38

MvvmLight를 사용한다는 기준으로 작성한다.


1
2
3
4
        private void ExcuteSettingCommand()
        {
            MessengerInstance.Send(SettingEnum.OpenSettingPopup);
        }


MessngerInstance를 이용하여

일단 보내는 값을 object형태 (여기서는 enum)로 보낸다.


받는 ViewModel에서는


1
2
3
4
5
6
7
8
9
  public PopupViewModel()
        {
            MessengerInstance.Register<SettingEnum>(this, c => SettingExcute(c));
        }
 
        public void SettingExcute(SettingEnum result)
        {
            //some code
        }


이런식으로 등록하면 통신이 된다.

Posted by 동동(이재동)
wpf2017. 8. 7. 11:29

일반적으로 Grid라든지 컨트롤들은 자동으로 해상도에 맞게 조절해주지만


이미지는 크기가 정해져 있어서 이미지 크기가 유동적으로 변하지 않는다.


그래서 만약 Grid를 사용할때 퍼센트를 이용해서 분할하였다면 이미지를 사용한 Row나 column은 이미지가 짤릴경우가 있다.


이럴때는 ViewBox로 그 Row를 감싸면 깔끔해진다.



Posted by 동동(이재동)
wpf2017. 7. 25. 17:41

List는 List<ConvertOrderKey>이런식으로 자료가 들어가 있고


ItemTemplate안에는 

<Button Content="주문확인" Width="70" Command="{Binding ElementName=xListView, Path = DataContext.OrderClickCommand}" CommandParameter="{Binding}" />


이런식으로 구현하였다.

커맨드 파라미터는 그냥 ConvertOrderKey모델 전체를 넘겼다.


viewModel에서는


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 private RelayCommand<ConvertOrderKey> _orderClickCommand;
 
        public RelayCommand<ConvertOrderKey> OrderClickCommand
        {
            get
            {
                return _orderClickCommand
                  ?? (_orderClickCommand = new RelayCommand<ConvertOrderKey>(
                    param =>
                    {
                        var temp = param;
                    }));
            }
        }

이렇게 구현하였다.

param에 모델데이터가 전부 넘어온다.


Posted by 동동(이재동)
wpf2017. 7. 24. 15:03

List<Object Class> 의 리스트를 duplicate 해서 새로운 리스트를 만들고 그안에 object property를 수정하고 싶었다.


하지만 list를 duplicate 했더라도 안에 프로퍼티를 바꾸면 오리지널 데이터까지 바뀌어졌다.
그래서 해당 obejct class 에 ICloneable interface를 사용하여서 해결하였다.

이렇게 object에 interface를 선언하고

1
2
3
4
5
6
7
8
9

public class OrderItem : ICloneable
    {     
        public int GroupCount { get; set; }
 
        public object Clone()
        {
            return this.MemberwiseClone();
        }
    }

구현 하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static List<OrderItem> GroupOrderItemByName(List<OrderItem> orderList)
        {
            var groupOrderItemList = new List<OrderItem>();
            var result = orderList.GroupBy(s => s.Name).ToList();
 
            foreach (var item in result)
            {
                var orderItem = (OrderItem)item.ToList()[0].Clone();
                orderItem.GroupCount = item.Count();
                groupOrderItemList.Add(orderItem);
            }
            
             return groupOrderItemList;
         }


참고 : https://stackoverflow.com/questions/6569486/creating-a-copy-of-an-object-in-c-sharp



Posted by 동동(이재동)
wpf2017. 7. 21. 15:51

소켓통신 하는도중 

Int형을 String형으로 받으면 

"1\u0018어쩌구저쩌구"

이런식으로 들어왔다.

이럴때 Non-Ascii를 제거하는 코드 이다..


1
2
3
String test = "스트링";
 
Regex.Replace(test, @"[^\u001F-\u007F]+"string.Empty);


제일 좋은건 그냥 Int는 Int형식으로 받는게 가장 깔끔하다..


어쩔수 없을때만 쓰자

참고 : https://stackoverflow.com/questions/123336/how-can-you-strip-non-ascii-characters-from-a-string-in-c



Posted by 동동(이재동)
wpf2017. 7. 21. 15:13

내가 하고 싶었던거는


이렇게 BASE Model Class가 있고

1
2
3
4
5
public class OrderKey
    {
        public string nTempOrderID { get; set; }
        public string nOrderID { get; set; }
    }


OrderKey를 상속받는 클래스가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ConvertOrderKey : OrderKey
    {
        public List<OrderItem> OrderItemList { get; set; }
 
        public void CopyFromBase(OrderKey orderKey)
        {
            // copy base class properties.
            foreach (PropertyInfo prop in orderKey.GetType().GetProperties())
            {
                PropertyInfo prop2 = orderKey.GetType().GetProperty(prop.Name);
                prop2.SetValue(this, prop.GetValue(orderKey, null), null);
            }
        }
    }

ConvertOrderKey는 OrderKey를 상속받고 추가로 List를 하나 더 추가하는것이였다.


CopyFromBase라는 메소드를 만들어서 단순히 orderkey에 있는 내용을 전부 클래스에 복사한다.

이렇게 하면


1
2
3
4
5
6
7
8
9
10
11
 public static void ConvertData(ObservableCollection<OrderKey> orderKey)
        {   
            var covertOrderKeyList = new ObservableCollection<ConvertOrderKey>();
            foreach (var item in orderKey)
            {
                ConvertOrderKey cok = new ConvertOrderKey();
                cok.CopyFromBase(item);
                cok.OrderItemList = new List<OrderItem>();
                covertOrderKeyList.Add(cok);
            }
        }
 

이런식으로 기존 Base 클래스 List안에 있는것들에 있는것들을 상속받은 Class로 Copy하고

추가로 OrderITemList값을 지정할수 있다.


참고 : https://social.msdn.microsoft.com/Forums/vstudio/en-US/2105f08f-50ce-47a3-8e2a-3e62634d4cbc/copy-properties-from-base-class-to-derived-class-without-manually-mapping-them?forum=csharpgeneral

'wpf' 카테고리의 다른 글

List Object를 Copy 해보자. (ICloneable)  (0) 2017.07.24
non-ASCII를 없애보자.  (0) 2017.07.21
listbox에서 오른쪽 정렬하고 싶을때  (0) 2017.07.18
[WPF] NavagionManager  (0) 2017.07.17
MVVM Button Click Command 사용법  (0) 2017.07.17
Posted by 동동(이재동)
wpf2017. 7. 18. 16:43

보통 기본 리스트박스로 만들면 이렇게 item 이 들어간다.


enter image description here


만약 

enter image description here


이렇게 하고 싶다면

<ListBox>
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>


출처 : https://stackoverflow.com/questions/20934261/align-grid-column-to-right

'wpf' 카테고리의 다른 글

non-ASCII를 없애보자.  (0) 2017.07.21
Base 모델 클래스에 있는 데이터를 상속 클래스에 COPY 하기  (0) 2017.07.21
[WPF] NavagionManager  (0) 2017.07.17
MVVM Button Click Command 사용법  (0) 2017.07.17
MVVM을 쓰면서...  (3) 2016.10.24
Posted by 동동(이재동)
wpf2017. 7. 17. 16:58

Grid 같은 패널에 Add,Clear 하면서 임시로 nagiation처럼 되도록 하는 방법이 있지만


Frame을 이용하면 더 깔끔하게 가능하다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public static class NavigationManager
    {
        private static Frame _mainContentFrame;
 
        public static void SetFrame(Frame frame)
        {
            _mainContentFrame = frame;
        }
 
        public static void Navigate(UserControl page)
        {
            _mainContentFrame.Navigate(page);
        }
    }


Xaml


1
2
3
<Grid x:Name="xMainWindowPanel">
        <Frame x:Name="xMainFrame" NavigationUIVisibility="Hidden" />
</Grid>


사용법


1
2
3
4
5
  private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            NavigationManager.SetFrame(xMainFrame);
            xMainFrame.Navigate(new LoginPage());
        }

추가...

naviagte를 하게 되면 이전 페이지가 필요 있으면 메모리에 남게 되므로 메모리 관리에 문제가 있을수 있다.

 public static void Navigate(UserControl page)
        {
            _mainContentFrame.Navigate(page);

            while (_mainContentFrame.CanGoBack == true)
            {
                _mainContentFrame.RemoveBackEntry();
            }
        }

RemoveBackEntry()로 지워주자


Posted by 동동(이재동)
wpf2017. 7. 17. 16:54

일단 Command를 만든다.

1
2
        private bool _deleteCommand = true;
        public RelayCommand DeleteCommand { get; private set; }
 


ViewModel 생성자에 넣기

1
2
3
4
5
 public MainViewModel()
        {
            DeleteCommand = new RelayCommand(ExcuteDeleteCommand, () => _deleteCommand);
            OrderMenuList = new ObservableCollection<OrderMenu>();
        }



1
2
3
4
 private void ExcuteDeleteCommand()
        {
            OrderMenuList.RemoveAt(OrderMenuList.Count - 1);
        }


xaml코드에는


1
<Button x:Name="xdelete" Content="삭제"  Height="50" Margin="20" Command="{Binding DeleteCommand}" />


여러가지 파라미터를 사용하고 싶으면 여기 참고

https://msdn.microsoft.com/en-us/magazine/dn237302.aspx

Posted by 동동(이재동)