WPF ControlTemplate Style Binding ๋ฌธ์ œ

์•ˆ๋…•ํ•˜์„ธ์š”.

Button Over์‹œ Background์— ์ด๋ฏธ์ง€1์„,
Button Leave์‹œ Background์— ์ด๋ฏธ์ง€2๋ฅผ ์˜ฌ๋ฆฌ๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ธ”๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ๋ฒ•์„ ์ฐพ์•˜๊ณ  ControlTemplate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

Xaml UserControl.Resources

    <UserControl.Resources>
        <ControlTemplate TargetType="Button" x:Key="RoundButtonTemplate">
            <Border Background="{TemplateBinding Background}" CornerRadius="15">
                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </Border>
        </ControlTemplate>

        <Style TargetType="{x:Type Button}" x:Key="TriggerButtonOver">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="False">
                    <Setter Property="Background">
                        <Setter.Value>
                            <SolidColorBrush Color="{Binding BtnUp}"/>
                        </Setter.Value>
                    </Setter>
                </Trigger>

                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background">
                        <Setter.Value>
                            <SolidColorBrush Color="{Binding BtnOver}"/>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </UserControl.Resources>

Button (Over, Leave)

            <Button Width="100" Height="100" VerticalAlignment="Bottom" HorizontalAlignment="Right"
                    Margin="0,0,60,60"
                    Visibility="{Binding NextBtnVisibility}" 
                    Command="{Binding CommandToNextPageU}" 
                    Style="{StaticResource TriggerButtonOver}" 
                    Template="{StaticResource RoundButtonTemplate}">
            </Button>

ViewModel

        public Color BtnUp
        {
            get { return Color.FromArgb(255, 0, 0, 0); }
        }

        public Color BtnOver
        {
            get { return Color.FromArgb(255,255,0,0); }
        }

โ€˜๋Œ€์ƒ ์š”์†Œ์˜ ๊ด€๋ฆฌํ•˜๋Š” FrameworkElement ๋˜๋Š” FrameworkContentElement๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.โ€™

๊ณผ ๊ฐ™์ด Value์˜ ๊ฐ’์„ ์ง์ ‘ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒฝ์šฐ, ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์ง€๋งŒ
ํ•ด๋‹น ๋ถ€๋ถ„์— Binding ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋‹ˆ ์œ„์™€ ๊ฐ™์€ Xaml ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ ์ƒ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์–ด๋ณด์ด๋Š”๋ฐ, ์ž˜๋ชป๋œ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์•„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ข‹์€์ง€ ๊ถ๊ธˆํ•˜์—ฌ ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค.. ๋„์™€์ฃผ์„ธ์š”..ใ… ใ… 

1๊ฐœ์˜ ์ข‹์•„์š”

๊ทธ๋ƒฅ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๋กœ Background์†์„ฑ์— Brush๋ฅผ ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<Style.Triggers>
    <Trigger Property="IsMouseOver" Value="False">
        <Setter Property="Background" Value="{Binding BtnUp}"/>
    </Trigger>

    <Trigger Property="IsMouseOver" Value="True">
        <Setter Property="Background" Value="{Binding BtnOver}"/>
    </Trigger>
</Style.Triggers>
public Brush BtnUp
{
    get { return (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFFF0000")); }
}

public Brush BtnOver
{
    get { return (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFFFFF00")); }
}

๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋ƒฅ ์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ ๋Œ€์ƒ์„ ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ฝ๊ธฐ์ „์šฉ ์†์„ฑ์„ ๋ฐ”์ธ๋”ฉ ํ•˜๊ธฐ ๋ณด๋‹จ ๊ทธ๋ƒฅ ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ๊ฐ’์„ ์ง์ ‘ ํ• ๋‹น ํ•˜์‹œ๋Š”๊ฒƒ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”
<Trigger Property="IsMouseOver" Value="True">
     <Setter Property="Background" Value="{Binding BtnOver}"/>
     </Setter>
</Trigger>

@aroooong ๋‹˜์ด ๋จผ์ € ์˜ฌ๋ ค์ฃผ์…จ๋„ค์š” :smile:

2๊ฐœ์˜ ์ข‹์•„์š”

์˜ค! ใ… ใ…  ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋•๋ถ„์— ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ๋Š” ๋™์ ์œผ๋กœ ๋กœ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ Background์— ImageBrush๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ฌ๋ฆฌ๋ ค ํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„ํŠผ์˜ Up, Down ์ƒํƒœ์— ๋”ฐ๋ฅธ ์ด๋ฏธ์ง€๊ฐ€ ๋นŒ๋“œ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ์—
์ง€์†์ ์œผ๋กœ ์ด๋ฏธ์ง€๋งŒ ๊ต์ฒดํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹คโ€ฆ ใ… ใ…  (์œ ์ €๊ฐ€ ์ง์ ‘ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋„๋ก)

๋•Œ๋ฌธ์— ์ง€๊ธˆ์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ์ •ํ•ด์ง„ ๊ฒฝ๋กœ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ ์ €์žฅ์‹œํ‚ค๊ณ 
์•„๋ž˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฒ„ํŠผ์˜ ์ด๋ฏธ์ง€๋งŒ Binding ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ํ˜น์‹œ ์ด ๋ฐฉ๋ฒ•๋„ ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•์ผ๊นŒ์š”โ€ฆ?
ํ”„๋กœ๊ทธ๋žจ ๊ฒฝํ—˜์ด ์งง์•„์„œ ์ข‹์€ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์„์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ํ‚ค์›Œ๋“œ ์ข€ ๋ถ€ํƒ๋“œ๋ฆด๊ฒŒ์š”

        public ImageBrush BtnOver
        {
            get { return new ImageBrush(_resourceManager.btnINext[1]); }
        }


        public ImageBrush BtnUp
        {
            get { return new ImageBrush(_resourceManager.btnINext[0]); }
        }
1๊ฐœ์˜ ์ข‹์•„์š”

๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! :smile:

1๊ฐœ์˜ ์ข‹์•„์š”

์ด๋ ‡๊ฒŒ ์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ์„ ์ด์šฉํ•˜๋ฉด ํ•ด๋‹น ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ โ€˜์„ค์ •โ€™ ์„ ํƒ๊ถŒ์ด ์—†๊ณ , ์ด๋ฏธ์ง€๊ฐ€ ๋ณ€๊ฒฝ ๋œ๋‹ค๋˜๊ฐ€ ํ•œ ๊ฒฝ์šฐ ์ง์ ‘ ํ•ด๋‹น ์ปจํŠธ๋กค ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋˜ํ•œ ํ•ด๋‹น ์ปจํŠธ๋กค์ด ์ˆ˜์ • ๋œ๋‹ค๋ฉด ์‚ฌ์šฉ๋˜๋Š” ์ชฝ์—์„œ๋„ 2์ฐจ ๋ณ€๊ฒฝ์„ ํ•ด์•ผ ํ•˜๋Š” ๋ฐœ์ƒ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๊ตฌ์š”

๊ฐœ๋ฐœ ๊ด€์ ์œผ๋กœ ๋ณด์•˜์„๋•Œ

ํ•ด๋‹น ์ปจํŠธ๋กค์„ ์ œ๊ณตํ•˜๋Š” ์ž…์žฅ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ ๋ฐ”์ธ๋”ฉํ•ด์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก '๊ธฐ๋Šฅโ€™์„ ์ œ๊ณตํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

<์ด๋ฏธ์ง€๋ฒ„ํŠผ Normal="{Binding ~~~}"
                     Over="{Binding ~~~~~~}" />

์ฒ˜๋Ÿผ์š”

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ด๋ฏธ์ง€๋ฒ„ํŠผ ์ž์ฒด์˜ ์ปค์Šคํ…€ ์ปจํŠธ๋กค ๋งŒ๋“ค์–ด ์‚ฌ์šฉ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ณด์„ธ์š”.

[์ด๋ฏธ์ง€ ๋ฒ„ํŠผ ์ปค์Šคํ…€ ์ปจํŠธ๋กค]
WPFKakaoTalk/Common/Controls/ImageButton.cs at master ยท tyeom/WPFKakaoTalk (github.com)

[์Šคํƒ€์ผ]
WPFKakaoTalk/Common/Themes/Generic.xaml at master ยท tyeom/WPFKakaoTalk (github.com)

3๊ฐœ์˜ ์ข‹์•„์š”

๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! +

๋•๋ถ„์— ์–ด๋–ป๊ฒŒ ๋ฐฉํ–ฅ์„ฑ์„ ์„ค์ •ํ•˜๊ณ  ์ข‹์€ ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. :grinning:

1๊ฐœ์˜ ์ข‹์•„์š”