ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WPF에서 트리거에 따라 다른 이미지를 가지는 버튼 구현하기.
    WPF 2019. 12. 13. 13:45

    WPF에서 버튼 구현하는 방법.

     

    버튼은 4가지 상태(Normal, Disabled, Mouse over, Pressed)에 대한 트리거를 가지고 있으며,

     

    각각에 트리거에 따라 서로 다른 이미지를 디스플레이 함.

     

    트리거에 따라 이미지를 교체하는 방법에 대해 정리함.

     

     

    각 상태에 따른 이미지는 다음과 같다고 가정

    상태 이미지 이름
    Normal Image.png
    Disabled Image_d.png
    Mouse over Image_m.png
    Pressed Image_p.png

    이 이미지 이름의 공통된 값은 런타임 인스턴스의 Tag 값에 삽입될 예정이고,

    템플릿에서 런타임 인스턴스의 Tag 값과 바인딩하여 원하는 경로로 Convert 한 값을

    Image의 Source 값으로 이용할 겁니다.

     


    1. ResourceDictionary 파일 추가 및 ControlTemplate 구현

        <ControlTemplate x:Key="BASEBTN" TargetType="{x:Type Button}">
            <Grid>
                <Image Name="img" Source="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}, Converter={local:CvrtNomral}}" Stretch="None">
                </Image>
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter TargetName="img" Property="Source" Value="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}, Converter={local:CvrtDisabled}}"/>
                </Trigger>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter TargetName="img" Property="Source" Value="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}, Converter={local:CvrtMover}}"/>
                </Trigger>
                <Trigger Property="IsPressed" Value="True">
                    <Setter TargetName="img" Property="Source" Value="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}, Converter={local:CvrtPressed}}"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>

     

    2. ResourceDictionary를 프로그램 전반에서 사용할 수 있도록 App.xaml에 등록

        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Template/ControlTemplate.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>

     

    3. 버튼 선언 시 Template 이용하면 됩니다.

    <Button Name="버튼 식별자" Template="{StaticResource BASEBTN}" Tag="공통 이미지 이름"/>

     

    이 때 Converter는 특정 인터페이스를 구현한 상태이고 (OnewayConverter)

     

    공통 이미지 이름을 받아서

     

    경로+공통이미지이름+트리거에 따른 식별자+확장자 값을 조합하여

     

    리턴하는 함수를 가지고 있음.

     

    4. 코드(*.cs)에서 OnewayConverter 구현.

        public abstract class OnewayConverter : MarkupExtension, IValueConverter
        {
            public OnewayConverter() { }
            public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return new NotImplementedException();
            }
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                return this;
            }
        }
    
        public class CvrtNormal : OnewayConverter
        {
            public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return "경로+공통이미지이름+트리거에 따른 식별자+확장자 값";
            }
        }
        
        ...

    - OnewayConverter 출처 : https://medium.com/@Rando209/wpf-data-binding-with-ivalueconverter-f5e459e03f8e

     

    끝.

    'WPF' 카테고리의 다른 글

    [WPF] 윈도우 창 띄울 때, 화면 중앙으로  (0) 2020.04.29
    [WPF] 현재 윈도우 닫기  (0) 2020.04.29
    WPF - TemplateBinding 과 Binding 의 차이  (0) 2019.12.13
    WPF 전체 화면 설정  (0) 2019.12.12
Designed by Tistory.