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개의 좋아요

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개의 좋아요

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

2개의 좋아요

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

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

3개의 좋아요

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

2개의 좋아요

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

3개의 좋아요

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

2개의 좋아요