Combobox не выберет ни одного элемента при нажатии на поле между элементами - PullRequest
1 голос
/ 05 января 2012

Эту проблему, вероятно, лучше всего объяснить с помощью видео. Смотрите здесь: http://youtu.be/r_phl8g9AzY По сути, выделение в моем комбинированном окне прекрасно работает, когда мышь находится над прямоугольником выделения, но между прямоугольниками выделения для каждого элемента есть область, где следующий элемент не будет выделен, но если вы нажмете, когда мышь находится в этой области , он действует так, как будто вы нажали за пределами поля со списком, то есть он возвращается к старому выбору. Вместо этого я бы ожидал, что он выберет выделенный в данный момент элемент.

Я гуглил эту проблему, думая, что это может быть общая проблема WPF, но ничего не нашел, поэтому я предполагаю, что это что-то в моем стиле. В выпадающем списке используются некоторые шаблоны - я не совсем уверен, что имеет значение, поэтому я вставил большую часть этого ниже. Я попытался возиться с радиусами прямоугольника элемента списка, но безуспешно. Фактический экземпляр выпадающего списка не отменяет ни одну из этих настроек. Любая помощь будет оценена. Спасибо!

<Style TargetType="{x:Type ComboBox}">
    <Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <Setter Property="Template" Value="{DynamicResource ComboBoxTemplate}" />
</Style>

<ControlTemplate x:Key="ComboBoxTemplate" TargetType="{x:Type ComboBox}">
    <Grid x:Name="grid">
        <ToggleButton Grid.Column="2" Template="{DynamicResource ComboBoxToggleButton}" x:Name="ToggleButton" Focusable="false" IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press" >
            <TextBox Visibility="Hidden" Template="{DynamicResource ComboBoxTextBox}" HorizontalAlignment="Stretch" Margin="0,3" x:Name="PART_EditableTextBox" Style="{x:Null}" VerticalAlignment="Center" Focusable="True" Background="{DynamicResource LightBrush}" IsReadOnly="{TemplateBinding IsReadOnly}" BorderBrush="{DynamicResource NormalBorderBrush}" Foreground="{DynamicResource TextBrush}" />
        </ToggleButton>
        <ContentPresenter HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="ContentSite" VerticalAlignment="Center" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" IsHitTestVisible="False" />
        <Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide">
            <Grid MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True">
                <Border x:Name="DropDownBorder" Background="{DynamicResource ControlBackgroundBrush}" CornerRadius="3,3,3,3" />
                <ScrollViewer Margin="4,6,4,6" Style="{DynamicResource NuclearScrollViewer}" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True" Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}">
                    <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
                </ScrollViewer>
            </Grid>
        </Popup>
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger Property="HasItems" Value="false">
            <Setter Property="MinHeight" Value="95" TargetName="DropDownBorder" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}" />
            <Setter Property="Opacity" TargetName="grid" Value="0.5" />
        </Trigger>
        <Trigger Property="IsGrouping" Value="true">
            <Setter Property="ScrollViewer.CanContentScroll" Value="false" />
        </Trigger>
        <Trigger Property="AllowsTransparency" SourceName="Popup" Value="true">
            <Setter Property="Margin" Value="0,2,0,0" TargetName="DropDownBorder" />
        </Trigger>
        <Trigger Property="IsEditable" Value="true">
            <Setter Property="IsTabStop" Value="false" />
            <Setter Property="Visibility" Value="Visible" TargetName="PART_EditableTextBox" />
            <Setter Property="Visibility" Value="Hidden" TargetName="ContentSite" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

<Style d:IsControlPart="True" TargetType="{x:Type ComboBoxItem}">
    <Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                <ControlTemplate.Resources>
                    <Storyboard x:Key="HoverOn">

                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="HoverRectangle" Storyboard.TargetProperty="(UIElement.Opacity)">
                            <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="1" />
                        </DoubleAnimationUsingKeyFrames>

                    </Storyboard>
                    <Storyboard x:Key="HoverOff">

                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="HoverRectangle" Storyboard.TargetProperty="(UIElement.Opacity)">
                            <SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="0" />
                        </DoubleAnimationUsingKeyFrames>

                    </Storyboard>
                    <Storyboard x:Key="SelectedOn">

                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="SelectedRectangle" Storyboard.TargetProperty="(UIElement.Opacity)">
                            <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="1" />
                        </DoubleAnimationUsingKeyFrames>

                    </Storyboard>
                    <Storyboard x:Key="SelectedOff">

                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="SelectedRectangle" Storyboard.TargetProperty="(UIElement.Opacity)">
                            <SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="0" />
                        </DoubleAnimationUsingKeyFrames>

                    </Storyboard>

                </ControlTemplate.Resources>
                <Grid SnapsToDevicePixels="true" Margin="1,1,1,1">
                    <Rectangle x:Name="Background" IsHitTestVisible="False" Opacity="0.25" Fill="{StaticResource NormalBrush}" RadiusX="1" RadiusY="1" />
                    <Rectangle x:Name="HoverRectangle" IsHitTestVisible="False" Opacity="0" Fill="{StaticResource NormalBrush}" RadiusX="1" RadiusY="1" />
                    <Rectangle x:Name="SelectedRectangle" IsHitTestVisible="False" Opacity="0" Fill="{StaticResource SelectedBackgroundBrush}" RadiusX="1" RadiusY="1" />
                    <ContentPresenter Margin="5,2,0,2" x:Name="contentPresenter" VerticalAlignment="Center" />
                    <Rectangle x:Name="FocusVisualElement" Visibility="Collapsed" Stroke="{StaticResource HoverShineBrush}" StrokeThickness="1" RadiusX="1" RadiusY="1" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsHighlighted" Value="true">
                        <Trigger.ExitActions>
                            <BeginStoryboard Storyboard="{StaticResource SelectedOff}" x:Name="SelectedOff_BeginStoryboard"/>
                        </Trigger.ExitActions>
                        <Trigger.EnterActions>
                            <BeginStoryboard Storyboard="{StaticResource SelectedOn}" x:Name="SelectedOn_BeginStoryboard"/>
                        </Trigger.EnterActions>

                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Trigger.ExitActions>
                            <BeginStoryboard Storyboard="{StaticResource HoverOff}" x:Name="HoverOff_BeginStoryboard"/>
                        </Trigger.ExitActions>
                        <Trigger.EnterActions>
                            <BeginStoryboard Storyboard="{StaticResource HoverOn}"/>
                        </Trigger.EnterActions>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Ответы [ 3 ]

1 голос
/ 05 января 2012

Это вряд ли ошибка, если вы установите поле, в этом месте нет элемента, так почему же его нужно выбрать?

Просто удалите Margin на самом верхнем Grid и оберните его вBorder с эквивалентным Padding, который создает те же результаты, но должен быть теперь активируемым (возможно, Border.Background следует установить на Transparent, если еще нет тестирования на попадание).

1 голос
/ 08 мая 2013

У меня было то же поведение, которое я исправил, убрав отступы на границе вокруг ContentPresenter для ComboBoxItem. Я заменил его с помощью поля на ContentPresenter.

Щелчок между элементами не выбран Выбор выделенного ComboBoxItem

<ControlTemplate TargetType="ComboBoxItem">
  <Border Name="Border" SnapsToDevicePixels="true" CornerRadius="2" Padding="2">
    <ContentPresenter />
   </Border> 
   <!-- ...removed for brevity -->
</ControlTemplate>

ИСПРАВЛЕНИЕ: щелчки между элементами теперь Выберите выделенный ComboBoxItem

<ControlTemplate TargetType="ComboBoxItem">
  <Border Name="Border" SnapsToDevicePixels="true" CornerRadius="2">
    <ContentPresenter Margin="2" />
   </Border> 
   <!-- ...removed for brevity -->
</ControlTemplate>
0 голосов
/ 05 января 2012

Имеет ли какое-либо значение удаление Margin="1,1,1,1" из Grid в вашем ComboBoxItem ControlTemplate или Margin="5,2,0,2" из ContentPresenter внутри этого Grid?

У него естьбыть маржой / отступом на вашем ComboBoxItem ControlTemplate Я бы подумал.

...