ComboBoxItem Trigger 질문 드립니다.

ComboBoxItem의 스타일을 가져와서 수정하면서 해보고있는데
이제 테스트 하다보니 궁금한점이 있어서 질문드립니다.

<Style x:Key="{x:Type ComboBoxItem}"
   TargetType="{x:Type ComboBoxItem}">
    <Setter Property="SnapsToDevicePixels"
      Value="true" />
    <Setter Property="OverridesDefaultStyle"
      Value="true" />
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                <Border x:Name="Border" 
                        MinHeight="22" 
                        Padding="2" 
                        SnapsToDevicePixels="true"
                        Background="{StaticResource clComboBoxBasedBackground}" BorderBrush="#020B11" BorderThickness="0,0,0,1">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="SelectionStates">
                            <VisualState x:Name="Unselected" />
                            <VisualState x:Name="Selected">
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                                        <EasingColorKeyFrame KeyTime="0" Value="#101318" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="SelectedUnfocused">
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                            Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                                        <EasingColorKeyFrame KeyTime="0" Value="Transparent" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter Property="BorderBrush" TargetName="Border" Value="{StaticResource clButtonMouseOverBorderBrush}"/>
                        <Setter Property="BorderThickness" TargetName="Border" Value="1"/>
                        <Setter Property="Foreground" Value="{StaticResource clButtonMouseOverBorderBrush}"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="BorderBrush" TargetName="Border" Value="{StaticResource clButtonMouseOverBorderBrush}"/>
                        <Setter Property="BorderThickness" TargetName="Border" Value="1"/>
                        <Setter Property="Foreground" Value="{StaticResource clButtonMouseOverBorderBrush}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

현재 기본 템플을 수정해서 위에 ComboboxItem을 사용하고 있습니다

  1. ComboboxItem에서 이제 안에 있는 Item중에 가장 아래있는 Item의 Border의 밑에 부분만 CornerRadius 를 주고싶은데 혹시 Trigger에 마지막을 확인 할 수있는 트리거가 있을까요?

  2. Trigger 중에 가장 자주 쓰는게 IsMouseOver, IsEnabled, IsPressed 인데 여러 컨트롤에 Trigger를 주다보면 IsPressed 는 가끔 멤버를 인식할 수 없다고 나오는데 이건 그 컨트롤에서 지원을 안 하기 때문에 못 하는 건가요?

  3. ComboBoxItem을 편 상태에서 키보드를 누르면 Border의 테두리가 점선으로 바뀌는 걸 해결 할 방법이 없을까요?

  4. 혹시 CheckBox나 RadioButton 같은 컨트롤에서 마지막으로 누른걸 Trigger로 찾을 수 있나요?

2 Likes

1번

ComboBox에서 CornerRadius를 주는 것이 일반적이지만 ComboBoxItem을 통해 처리한다면, 모델에서 마지막 여부를 미리 정의해두고 사용하면 되겠네요. 그밖에도 IValueConverter를 통해 ComboBoxItem을 ConvertParameter로 넘겨서 DataContext와 ComboBox.itemsSource의 마지막 값을 비교하는 방법도 있을 것 같네요. 제가 떠올린 방법들은 모두 이상하긴 합니다… ㅎㅎ

2번

IsPressed의 지원 여부는 ControlTemplate의 TargetType 대상이 IsPressed 프로퍼티를 지원하는지에 달려있습니다. 대표적으로 Button이 있죠, 또한 Button의 ControlTemplate이더라도 TargetType이 누락될 경우 Button에서 제공하는(ButtonBase려나…) IsPressed를 사용할 수 없습니다.

3번

FocusVisualStyle 값을 Value=“{x:Null}” 해주시면 됩니다.

<Setter Property="FocusVisualStyle" Value="{x:Null}"/>

4번

좀 더 구체적으로 설명해주시겠어요?

3 Likes

감사합니다~
4번은 해결했습니다. 생각해보니 IsFocused 를 Trigger로 주면 컨트롤 마지막으로 클릭한걸 알 수 있더라구요

2 Likes

@HongAhri 아 4번이 그런 내용이였군요. 해결 방법 공유해주셔서 감사합니다.

1/2/3번은 해결이 되신건가요?

3 Likes

1번은 아직 만들어보고 있고
3번은 comboboxBase에 적용시켜봤는데 그대로 점선으로 나오네요

2 Likes

앗 FocusVisualStyle은 ComboBoxItem쪽에 적용해야 하지 않을까요?

3 Likes

앗 맞네요 Item쪽에 넣으니 바로 됐습니다!
감사합니다!

2 Likes