WPF CustomControl ν•« λ¦¬λ‘œλ“œ

Riderλ₯Ό 주둜 μ“°κ³  있고 Visual StudioλŠ” 보쑰둜 μ“°κ³  μžˆμŠ΅λ‹ˆλ‹€. UIλ₯Ό μ’€ λ””ν…ŒμΌν•˜κ²Œ κ±΄λ“œλ €μ•Ό ν•΄μ„œ ν΄λ‘œλ“œ μ½”λ“œλ‘œ λͺ»ν•˜κ³  ν•œλ•€ν•œλ•€ μž‘μ—…μ€‘μΈλ°μš” .xaml은 hot reloadκ°€ 지원이 잘 μ•ˆλ˜κ³  νŠΉνžˆλ‚˜ CustomControl μŠ€νƒ€μΌλ‘œ μž‘μ—… ν•  λ•Œ ν•« λ¦¬λ‘œλ“œκ°€ μ•ˆλ˜μ„œ μƒ‰μƒν•˜λ‚˜, ν…Œλ‘λ¦¬ 색 ν•˜λ‚˜ λ°”λ€ŒλŠ” 것 확인 ν•˜λ €κ³  해도 ctrl + shift + f5둜 λ‹€μ‹œ μ‹œμž‘ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

RiderλŠ” 잘 μ•ˆλœλ‹€κ³  ν•˜μ—¬ Visual Studio 2022둜 ν•΄λ΄€λŠ”λ°λ„ ν•« λ¦¬λ‘œλ“œ μ μš©μ„ λͺ»ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

xaml μž‘μ—…μ‹œ Hot Reload 적용 ν•  방법이 μžˆμ„κΉŒμš”?

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:units="clr-namespace:MV1000.Support.UI.Units">
    
    <Style TargetType="{x:Type Border}" x:Key="GoldLine">
        <Setter Property="Background" Value="#00070E"></Setter>
        <Setter Property="BorderBrush" Value="#34291E"></Setter>
        <Setter Property="BorderThickness" Value="1 1 1 1"></Setter>
    </Style>

    <Style TargetType="{x:Type units:PadButton}">
        <Setter Property="Height" Value="38"></Setter>
        <Setter Property="Width" Value="165"></Setter>
        <Setter Property="Foreground" Value="#FFFFFF"></Setter>
        <Setter Property="Background" Value="Transparent"></Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type units:PadButton}">
                    <Grid Background="{TemplateBinding Background}">
                        <Border Style="{StaticResource GoldLine}" /> 
                        <TextBlock Text="{TemplateBinding Content}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

using System.Windows;
using System.Windows.Controls.Primitives;

namespace MV1000.Support.UI.Units;

public class PadButton : ToggleButton
{
    static PadButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(PadButton),
            new FrameworkPropertyMetadata(typeof(PadButton)));
    }
}

Style의 SetterλŠ” StaticResource둜 참쑰된 경우 Hot Reloadκ°€ λ°˜μ˜λ˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. StaticResourceλŠ” 컴파일 νƒ€μž„μ— ν•œ 번만 resolve되기 λ•Œλ¬Έμž…λ‹ˆλ‹€. DynamicResource둜 참쑰된 κ²½μš°μ—” 비ꡐ적 잘 λ°˜μ˜λ©λ‹ˆλ‹€. 반면, ControlTemplate λ‚΄λΆ€ μš”μ†Œλ“€μ€ λΉ„μ£Όμ–Ό 트리λ₯Ό 직접 κ΅¬μ„±ν•˜λŠ” μ˜μ—­μ΄κΈ° λ•Œλ¬Έμ— Hot Reloadκ°€ 잘 λ™μž‘ν•©λ‹ˆλ‹€.

Hot Reloadλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ μƒλ‹¨μ˜ λΆˆκ½ƒ μ•„μ΄μ½˜μ„ 눌러 μˆ˜λ™μœΌλ‘œ μ μš©ν•  수 있고, μ„€μ •μ—μ„œ β€œμ €μž₯ μ‹œ μžλ™ μ μš©β€ μ˜΅μ…˜μ„ ν™œμ„±ν™”ν•˜λ©΄ νŒŒμΌμ„ μ €μž₯ν•  λ•Œλ§ˆλ‹€ μžλ™μœΌλ‘œ λ°˜μ˜λ˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ •λ¦¬ν•˜λ©΄, Setter μ˜μ—­μ€ Hot Reloadλ₯Ό κΈ°λŒ€ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹κ³ , UI λ³€κ²½ μž‘μ—…μ€ ControlTemplate λ‚΄λΆ€μ—μ„œ μ§„ν–‰ν•˜λŠ” 것이 νš¨μœ¨μ μž…λ‹ˆλ‹€. λ˜ν•œ 개발 편의λ₯Ό μœ„ν•΄ μ €μž₯ μ‹œ μžλ™ 적용 μ˜΅μ…˜μ„ μΌœλ‘λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.


그리고 이것도..

자료좜처

2 Likes

μžλ¬Έμžλ‹΅ ν•΄λ΄…λ‹ˆλ‹€.

직접은 μ•ˆλ˜κ³  우회 ν•  방법이 μžˆμŠ΅λ‹ˆλ‹€.

μœ„μ™€ 같이 ResourceDectionaryλ₯Ό UserControl둜 ν•œλ²ˆ 감싸면 Previewλ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

1 Like