WPF μ–΄λ ΅λ„€μš”

MVVM 같은 μƒμ†Œν•œ νŒ¨ν„΄λ„ μ–΄λ ΅μ§€λ§Œ

@jamesnet214 μ†ŒμŠ€λ₯Ό Clone ν•˜λ©΄μ„œ λŠλ‚€κ²ƒμ§€λ§Œ

기쑴에 priism 을 λ‹€λ£¨λ©΄μ„œ 이제 μž˜μ•ˆμ“°μ‹œλŠ”κ²ƒ κ°™λ”κ΅°μš”

μ™ λ§Œν•œκ²ƒ λ‹€ μ»€μŠ€ν…€ ν•˜μ‹ κ²ƒ 가은데

μ΄λ ‡κ²Œ μƒμ§œλ‘œ class 라이브러리λ₯Ό wpf λͺ¨λ“ˆμ„ λ§Œλ“€λ•Œ

image

μ΄λ ‡κ²Œ μƒμ„±λλ‹ˆλ‹€. 그리고 여기에
csproj νŒŒμΌμ—

    <PropertyGroup>
        <TargetFramework>net8.0-windows</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
        <UseWPF>true</UseWPF>
        <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    </PropertyGroup>

μ΄λ ‡κ²Œ ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.
{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}

이 ꡬ문은 wpf ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜λ©΄ μ•ˆν•΄λ„ λ˜μ§€λ§Œ ν•΄μ€˜μ•Ό νŒŒμΌμΆ”κ°€μ‹œ wpf ν…œν”Œλ¦Ώμ„ 선택 κ°€λŠ₯ν•˜λΌκ΅¬μš”

그리고
image

그리고 μ΄λ ‡κ²Œ Properties 폴더λ₯Ό λ§Œλ“€κ³  μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ“°λŠ”
μ„±κ²©μ΄λ‚˜ λ¦¬μ†ŒμŠ€ νŒŒμΌμ„ 넣어놓아야 ν•˜κ³ 

image
ν™”λ©΄ ν•˜λ‚˜λ₯Ό λ§Œλ“€κΈ°μœ„ν•΄ μ΄λ ‡κ²Œ λ§Žμ€ 파일이 ν•„μš”ν•˜λ„€μš”

μ²˜μŒμ—λŠ” μ € ꡬ쑰가 이해가 μ•ˆκ°€μ„œ 헀맀고 windows λŠ” λ„λŒ€μ²΄ μ–΄λ””μžˆλŠ”κ²ƒμ•Ό
ν–ˆλŠ”λ° window κ°œλ…λ³΄λ‹€ VIEW κ°œλ…μœΌλ‘œ μ ‘κ·Όν•˜μ‹œλŠ”κ²ƒ κ°™λ”κ΅°μš”

    public class HomeContent : WPFView
{
	public HomeContent()
	{
		DefaultStyleKey = typeof(HomeContent);
	}

λ”°λΌν•œλ‹€κ³  μ΄λ ‡κ²Œ ν–ˆμ§€λ§Œ μ†”μ§νžˆ β€œDefaultStyleKey” 이건 무엇인지 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€ ^^

그리고 Theme 폴더에
ResourceDictionary 둜 κ΅¬μ„±ν•΄λ†“μœΌμ…¨λŠ”λ° λ„λŒ€μ²΄
μ–΄λ””μ„œ 맀인 content λ₯Ό λ†“λŠ”μ§€ λͺ°λΌμ„œ ν—€λ§ΈλŠ”λ°

<Style TargetType="views:HomeContent">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="views:HomeContent">
                <Grid Style="{StaticResource MainGridStyle}"    >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="2"/>
                        <RowDefinition Height="500"/>
                        <RowDefinition Height="1"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>  
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

λŒ€λž΅ μ΄λŸ°μ‹μœΌλ‘œ 핡심 Node이고 μ €κΈ°μ„œ λ””μžμΈμ„ ν•˜λ”κ΅°μš”
기쑴에 μ—¬κΈ°μ„œ 벽에 λΆ€λ”§μΉœκ²ƒμ΄ μ˜ˆμ „μ— μ“°λ˜
interative 속성은(Loaded 이벀트 같은것) μ–΄λ–»κ²Œ 써야 ν•˜λŠ”μ§€

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:james="clr-namespace:Jamesnet.Windows;assembly=Jamesnet.Windows"
  xmlns:feature="clr-namespace:NP.Support.UI.Features;assembly=NP.Support"
  xmlns:tray="http://schemas.lepo.co/wpfui/2022/xaml/tray"
  xmlns:sys="clr-namespace:System;assembly=System.Runtime"
  xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"                    
  xmlns:views="clr-namespace:NP.Home.Views

XML 의 Processing μ§€μ‹œμžλΌκ³  ν•˜λ‚˜μš” xml 이라 잘 와닿지 μ•Šκ³ 
url 둜 alias λ˜μžˆμ–΄μ„œ ν—·κ°ˆλ¦½λ‹ˆλ‹€. μ €κ±Έ μ •μ˜ν• λ €λ©΄ μœ„μ— properties
에 assemblyinfo.cs μ—μ„œ ν•˜λ”κ΅°μš”;;;

무엇보닀 generic.xaml

image

이건 νŒŒμΌμ€ μƒμ„±ν–ˆμ§€λ§Œ μ™œ μžλ™ μ μš©λ˜λŠ”μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€ ^^


λŒ€λž΅ λ”°λΌν•œλ‹€κ³  ν•˜κ³ μžˆλŠ”λ° james 아킀텍쳐에
wpfui λ₯Ό μž…νžˆλ‹€κ³  ν•˜κ³ μžˆλŠ”λ°

Navigation controlμ—μ„œ 벽에 λΆ€λ”§μ³€μŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ 핡심은 μ²˜μŒμ—λŠ” 기쑴에 μ•Œκ³ μžˆλ˜ prism μ΄λ‚˜ 일반적인 λ°©μ‹μœΌλ‘œ κ°œλ°œν• λ €κ³  ν–ˆλŠ”λ°
μ €λŸ° ꡬ쑰가 μš”μ¦˜ μ΅œμ‹  νŠΈλ Œλ“œμΈ winui κ°™μ€κ²ƒμœΌλ‘œ 이전이 쉽닀고 ν•΄μ„œ μ•ˆμ’‹μ€ 머리둜 헀맀고
μžˆμŠ΅λ‹ˆλ‹€.

그리고 μžˆλŠ” control듀을 κ·Έλƒ₯ κ°”λ‹€ μ“°λ‹€κ°€ 각 control 상속 받은 λΆ€λͺ¨ 속성 ν™•μΈν•΄μ„œ
ν•˜λ‚˜ν•˜λ‚˜ deep ν•˜κ²Œ λ΄μ•Όν•˜λŠ”μ μ΄ νž˜λ“œλ„€μš”

그리고 μ†”μ§νžˆ μ»€μŠ€ν…€ λ””μžμΈμ„ ν• λ €λ©΄ νŠΉμ • 컨트둀 ꡬ쑰가 μ–΄λ–»κ²Œ λ˜μ–΄μžˆλŠ”μ§€
λ‹€ λΆ„ν•΄ν•΄μ„œ 봐야 ν•˜λŠ”λ° 와 ^^;; μ• λ‹ˆλ©”μ΄μ…˜μ€ μ–΄λ–»κ²Œ 해야할지

근데 μ € generic.xaml 은 μ •μ˜λœ 파일 이름이라 μƒμ„±ν•˜λ©΄ μžλ™ 적용 λ˜λŠ”κ²ƒμΈκ°€μš”. ???

저ꡬ쑰λ₯Ό λ”°λΌν•˜κΈ΄ ν–ˆμ§€λ§Œ λ­”κ°€ λ„μ‹ν™”λœ 그림으둜 ν‘œν˜„μ„ ν•˜λ©΄ 더 이해가 μ‰¬μšΈκ²ƒ κ°™κΈ΄ν•˜λ„€μš”

μ–΄λ €μš΄ 이유λ₯Ό μ •λ¦¬ν•˜λ©΄

  1. κ°œλ°œλ°©λ²•μ΄ 정말 λ‹€μ–‘ν•˜λ‹€
  2. μ–‡κ²Œ λ„“κ²Œ μ•Œμ•„μ•Ό ν•œλ‹€.
  3. μ™œ?? λ­”κ°€ μžλ™μ μš©λ˜λŠ”κ²ƒμ΄ λ§Žμ•„μ„œ 이유λ₯Ό μ•„λŠ”κ²ƒμ΄ μ•„λ‹ˆλΌ κ·Έλ ‡κ΅¬λ‚˜ ν•˜λ©΄
    μ–‘μžμ—­ν•™μ μœΌλ‘œ 생각해야 할것이 λ§ŽμŠ΅λ‹ˆλ‹€.
3 Likes

μ˜μ™Έλ‘œ gptκ°€ xaml을 잘 μ•Œλ”κ΅°μš”. 물어보면 λŒ€λΆ€λΆ„ λ‹΅λ³€ν•΄μ£ΌλŠ”

2 Likes

1. generic.xaml의 μ—­ν• 

  • generic.xaml은 κΈ°λ³Έ μŠ€νƒ€μΌκ³Ό ν…œν”Œλ¦Ώμ„ μ •μ˜ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.
  • 일반적으둜 μ‚¬μš©μž 지정 컨트둀(Custom Control)을 λ§Œλ“€ λ•Œ κΈ°λ³Έ μŠ€νƒ€μΌκ³Ό ν…œν”Œλ¦Ώμ„ μ œκ³΅ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

2. μžλ™ 적용 쑰건

  • generic.xaml νŒŒμΌμ€ ν”„λ‘œμ νŠΈ λ‚΄μ˜ Themes 폴더에 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • λ°˜λ“œμ‹œ Themes/generic.xamlλΌλŠ” 이름을 κ°€μ Έμ•Ό ν•©λ‹ˆλ‹€.
  • 컴파일된 ν›„ λ¦¬μ†ŒμŠ€ 사전(Resource Dictionary)은 WPFκ°€ 컨트둀 μŠ€νƒ€μΌμ„ 검색할 λ•Œ μžλ™μœΌλ‘œ μ°Έμ‘°λ©λ‹ˆλ‹€.

3. μžλ™ 적용 κ³Όμ •

  • WPFλŠ” 컨트둀의 DefaultStyleKey 속성을 톡해 κΈ°λ³Έ μŠ€νƒ€μΌμ„ μ°ΎμŠ΅λ‹ˆλ‹€.
  • μ‚¬μš©μž 지정 컨트둀이 λ‘œλ“œλ  λ•Œ WPFλŠ” generic.xamlμ—μ„œ ν•΄λ‹Ή 컨트둀의 μŠ€νƒ€μΌμ„ μžλ™μœΌλ‘œ κ²€μƒ‰ν•©λ‹ˆλ‹€.
  • λ§Œμ•½ νŠΉμ • μ»¨νŠΈλ‘€μ— λŒ€ν•œ μŠ€νƒ€μΌμ΄ generic.xaml에 μ •μ˜λ˜μ–΄ 있으면, λͺ…μ‹œμ μœΌλ‘œ μ°Έμ‘°ν•˜μ§€ μ•Šμ•„λ„ μžλ™μœΌλ‘œ μ μš©λ©λ‹ˆλ‹€.

4. μ£Όμ˜μ‚¬ν•­

  • μŠ€νƒ€μΌ ν‚€(DefaultStyleKey)λŠ” 컨트둀의 Type이어야 ν•©λ‹ˆλ‹€.
  • Application.Resources에 λ™μΌν•œ ν‚€κ°€ 있으면 generic.xaml의 λ¦¬μ†ŒμŠ€λ³΄λ‹€ μš°μ„ ν•©λ‹ˆλ‹€.
  • λ§Œμ•½ νŠΉμ • λ¦¬μ†ŒμŠ€κ°€ μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ generic.xaml의 μœ„μΉ˜λ‚˜ 파일 이름이 μ •ν™•ν•œμ§€ 확인해야 ν•©λ‹ˆλ‹€.

정말 κ·Έλ ‡κ΅°μš” ;;; 근데 이걸 찾아보지 μ•ŠμœΌλ©΄ λͺ¨λ₯΄λŠ” λ‚΄μš©κ°™λ„€μš” @jamesnet214 λ‹˜μ΄ μ €λŸ° ꡬ쑰둜 λ§Œλ“  μ΄μœ κ°€ μžˆμ—ˆκ΅°μš”

4 Likes

이벀트 κ΄€λ ¨ν•΄μ„œλŠ” μ•„λž˜ 라이브러리λ₯Ό μ“°μ‹œλ©΄ λ˜μš”.
이벀트λ₯Ό VM에 바인딩 κ°€λŠ₯

4 Likes

μž¬μ›…λ‹˜μ˜ ν”„λ‘œμ νŠΈ ꡬ쑰λ₯Ό μž˜λ³΄μ‹œλ©΄
μ—¬λŠ MVVMκ³Ό λ‹€λ₯΄κ²Œ
Model 기반의 Control듀을 κ·Έλ €λ‚΄μ‹œλ €κ³  ν•˜λŠ” 흔적듀이 λ§ŽμŠ΅λ‹ˆλ‹€.

이점 주의 있게 λ³΄μ‹œλ©΄ μž¬λ°ŒμŠ΅λ‹ˆλ‹€ :slight_smile:

2 Likes

λ„€ μ†”μ§νžˆ ν”„λ‘œμ νŠΈ κ΅¬μ‘°λ‚˜ mvvm 은 μ–΄λ–»κ²Œ ν•˜κ² λŠ”λ°
λ””μžμΈ μ»€μŠ€ν…€ μ–΄λ ΅κ³  이걸 μœ„μ£Όλ‘œ κ³΅λΆ€ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€
성함은 잘λͺ¨λ₯΄κ² κ΅¬ vicky λ‹˜μ˜ μœ νŠœλ²„ μ˜μƒμ„ λ³΄λŠ”λ° 영문이긴 ν•œλ°
μ˜μ–΄κ³΅λΆ€λ„ 되고 μ—„μ²­ μž˜λ§Œλ“œμ…¨λ„€μš”

3 Likes

μ•„λ§ˆ κ·Έ vickyλ‹˜μ΄ @vickyqu115 λ‹˜μ΄μ‹€κ±°κ°™μŠ΅λ‹ˆλ‹€ γ…Žγ…Ž

2 Likes

λŒ“κΈ€ 달 생각이 μ—†μ—ˆλŠ”λ° 이 뢀뢄보고 제 ν‰μ†Œ 생각과 λ„ˆλ¬΄ μΌμΉ˜ν•΄μ„œ λŒ“κΈ€ λ‹΅λ‹ˆλ‹€β€¦γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹
μ–‘μžμ—­ν•™μ μΈβ€¦ κ·Έλ‹ˆκΉŒ λ­”κ°€ λ‹Ήμ—°ν•œ 것이고 과학적이긴 ν•œλ° 도무지 μ΄ν•΄λŠ” μ•ˆκ°€λŠ”β€¦γ…‹γ…‹γ…‹

3 Likes

UI의 μ„Έκ³„λŠ” WPF 뿐만 μ•„λ‹ˆλΌ, 뭘 해도 μ–΄λ €μš΄ 것 κ°™μŠ΅λ‹ˆλ‹€.

κ·Έλ ‡λ‹€κ³  λ‹€λ₯Έ λΆ„μ•ΌλŠ” 쉽냐… ν•˜λ©΄, 그것도 μ•„λ‹ˆμ£ .

μ•Œκ³ λ¦¬μ¦˜μ˜ μ„Έκ³„λŠ” λ°©λŒ€ν•˜κ³ ,
λ°±μ—”λ“œλŠ” λ³΄μ•ˆκ³Ό 운영 μ„±λŠ₯에 ν—ˆλ•μ΄λ©°,
ν•˜λ“œμ›¨μ–΄ μ œμ–΄ 뢄야도 만만치 μ•Šμ£ .

μ–΄λ €μš΄ 것을 ν•˜λ‹ˆκΉŒ, κ³΅λΆ€ν•˜λŠ” 것을 λ©ˆμΆ”μ§€ μ•ŠλŠ” 게 개발자인 것 κ°™μŠ΅λ‹ˆλ‹€.

2 Likes

WinForm에 λΉ„ν•˜λ©΄ 많이 μ–΄λ €μš΄ 것 κ°™μ•„μš”. γ…Ž