'분류 전체보기'에 해당되는 글 684건

  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. 2022.01.04 [asp.net core Blazor ver 6] MariaDB 연결하기
  9. 2022.01.04 ASP.NET Core Blazor Ver.6 시놀리지에서 돌려보기
  10. 2021.11.18 2개의 LIST 비교 하는것
  11. 2021.08.24 싱글톤 쓰기
  12. 2021.05.06 Combox 에 Enum 바인딩
  13. 2020.09.22 테슬라 자동화 프로그램 7
  14. 2020.04.28 WPF에서 기본적으로 제공해주는 BoolToVisConverter 컨버터
  15. 2020.03.06 WPF TabControl에서 SelectionChanged가 계속 호출되는 문제
  16. 2019.09.02 시놀리지에서 php 파일생성 권한 주기
  17. 2019.05.28 beautifulsoup에서 링크만 빼는법
  18. 2019.05.28 시놀리지에서 vpn client 사용하는 방법
  19. 2019.05.21 python 글로벌 변수 메소드에서 사용방법
  20. 2019.05.21 파이썬에서 텔레그램 메세지 에코
  21. 2019.05.17 파이썬 simple json 파싱
  22. 2019.05.17 파이썬 web request
  23. 2019.04.24 이벤트 중복 호출 되지 않게 하는법
  24. 2019.03.21 list depp copy , clone 하는 간단한 방법
  25. 2019.02.26 OpenCV, Face API를 이용해서 얼굴 검출하기 2번째
  26. 2019.02.25 Face API를 이용하여 얼굴 검색 및 비교해서 동일인 찾기
  27. 2017.10.19 wpf FlipView
  28. 2017.09.12 Listview , Button MouseOver, Selcted Color 제거
  29. 2017.09.06 Converter를 쓰지 않고 바인딩된 TextBlock에 글자를 추가하고 싶을때
  30. 2017.08.22 LIST의 UI에 즉각적으로 바인딩 업데이트를 하고 싶을때..
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 동동(이재동)
2022. 1. 4. 16:46

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2022. 1. 4. 16:38

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

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 동동(이재동)
카테고리 없음2020. 9. 22. 14:49

 

 

 

 

 

 

 

 

이 프로그램을 만든이유

 

전 이렇게 4가지가 불편하더라구요

 

1. 앱 켜기도 귀찮다.

-그냥 내리면 알아서 애프터 블로우 해주고

-그냥 내리면 오늘 주행거리가 얼마이며 베터리는 어느정도 썻는지 기록 통계

 

2. 앱키면 자꾸 시작중이 떠서 시간이 오래 걸림

-딥슬립상태라서 시작중이 끝나야 에어컨을 키든 제어를 할수 있어서 그냥 바로 되게 했습니다.

 

3.예약이 안된다.

-저같은경우는 센트리모드 베터리를 아낄려고 새벽 2-6시에는 감시를 안하게 했습니다.

-그래서 2시에 자동으로 꺼지고 6시에 자동으로 켜지게 해서 베터리를 조금 절약했습니다.

 

4.애프터 블로우 오작동이 없다.

-가끔 앱을 이용하면 안꺼져서 다음날 아침 베터리 20% 남았던 기억이 있는데 이건 계속 체크해서 그런일이 없네요 ㅎㅎ

 

선천적으로 워낙 게을러서 애프터 블로우도 까먹고 그래서 그냥 혼자서 쓸려고 간단히 만들어봤습니다~

 

모든게 귀찮습니다 알아서 다 되었으면 좋겠어요ㅎㅎ

 

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 동동(이재동)
NAS(시놀리지)2019. 9. 2. 12:38
  1. Open the Synology Diskstation Control Panel
  2. Click on "Shared Folder"
  3. Click on the shared folder that contains the file your PHP is trying to open for writing.
  4. Click "Edit"
  5. Go to permissions
  6. Choose "Local Groups"
  7. Give the group "http" Read/Write access
  8. Click OK
Posted by 동동(이재동)
Phython2019. 5. 28. 17:03

for a in soup.find_all('h6', {'class' : 'ellipsis'}):

    print(a.find('a').attrs['href'])

Posted by 동동(이재동)
Phython2019. 5. 28. 15:54

정부에서 차단된 사이트를 웹크롤링 하기 위해서 사용했다..

 

일단 공개된 vpn을 이용

 

https://www.vpngate.net/en/

 

VPN Gate - Public Free VPN Cloud by Univ of Tsukuba, Japan

Follow @vpngate Free Access to World Knowledge Beyond Government's Firewall. Your IP: 27.0.238.117Your country: Korea Republic ofLet's change your IP address by using VPN Gate! Today: 3,263,597 connections, Cumulative: 5,606,897,919 connections, Traffic: 1

www.vpngate.net

 

openVpn을 이용해서 ovpn 파일을 얻는다.

 

그리고 공개된 아이디와 패스워드 vpn/vpn으로 시놀리지 

 

제어판 - 네트워크 - 일반- 고급설정에서 다중게이트 활성화를 하고

 

네트워크 인터페이스로 이동하여 vpn 프로 파일 생성후 아이디 패스워드를 입력하고 vpn 끊어지면 다시 접속을 체크 한다.

 

그리고 생성되면 오른쪽 버튼을 눌러서 연결되면 이제부터 차단된사이트를 이용할수 있다.

Posted by 동동(이재동)
Phython2019. 5. 21. 12:34

 

글로벌 변수를 사용할려면  global을 메소드안에서 선언해 줘야 한다.

x = 10

 

def foo():

 global x

 x += 1

 print x

 

foo()

https://eli.thegreenplace.net/2011/05/15/understanding-unboundlocalerror-in-python

'Phython' 카테고리의 다른 글

beautifulsoup에서 링크만 빼는법  (0) 2019.05.28
시놀리지에서 vpn client 사용하는 방법  (0) 2019.05.28
파이썬에서 텔레그램 메세지 에코  (0) 2019.05.21
파이썬 simple json 파싱  (0) 2019.05.17
파이썬 web request  (0) 2019.05.17
Posted by 동동(이재동)
Phython2019. 5. 21. 12:01

from telegram.ext import Updater

from telegram.ext import CommandHandler

from telegram.ext import MessageHandler, Filters

 

 

def start(bot, update):

# Your bot will send this message when users first talk to it, or when they use the /start command

bot.sendMessage(chat_id=update.message.chat_id,

text="Hi. Send me any English text and I'll summarize it for you.")

 

def summarize(bot, update):

try:

# Get the text the user sent

text = update.message.text

bot.sendMessage(chat_id=update.message.chat_id,

text=text)

#print(text)

# Run it through the summarizer

except UnicodeEncodeError:

bot.sendMessage(chat_id=update.message.chat_id,

text="Sorry, but I can't summarise your text.")

 

updater = Updater(token=my_token)

dp = updater.dispatcher

 

summarize_handler = MessageHandler(Filters.text, summarize)

start_handler = CommandHandler('start', start)

 

dp.add_handler(summarize_handler)

dp.add_handler(start_handler)

 

dp.bot.sendMessage('사람 id',text="himan")

 

updater.start_polling(timeout=3,clean=True)

updater.idle()

 

Commandhander를 앞에 /나 @에 반응한다.

 

참고 :  https://blog.psangwoo.com/coding/2018/01/09/python-telegram-bot-3.html

 

Posted by 동동(이재동)
Phython2019. 5. 17. 14:27

import json

 

x = json.loads("json string", object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))

print(x.last_price)

Posted by 동동(이재동)
Phython2019. 5. 17. 14:26

import requests

 

url = 'https://api.bitfinex.com/v1/pubticker/btcusd'

response = requests.get(url)

response.status_code

response.text

 

print(response.text)

 

 

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 동동(이재동)