Как отобразить выбранный элемент и использовать границы со списком? И почему это происходит? - PullRequest
1 голос
/ 04 августа 2011

Как заставить выбранный элемент ComboBox отображаться в текстовом поле ComboBox И использовать Border s в ComboBox ControlTemplate?С помощью следующего кода элементы всплывают нормально, но никогда не отображаются в текстовом поле ComboBox после выбора;но удаление 2 Border s из шаблона ComboBox исправляет это.Зачем??Как??И что еще более важно: как я могу использовать этот шаблон с Border s И чтобы SelectedItem правильно отображался в текстовом поле ComboBox после выбора?

<Window.Resources>
    <Style x:Key="ComboboxDropdownButton" TargetType="{x:Type ToggleButton}">
        <Setter Property="MinWidth" Value="0"/>
        <Setter Property="MinHeight" Value="0"/>
        <Setter Property="Width" Value="NaN"/>
        <Setter Property="Height" Value="NaN"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="Black"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToggleButton}">
                    <DockPanel SnapsToDevicePixels="True" 
                               Background="{TemplateBinding Background}" 
                               LastChildFill="False">
                        <Border x:Name="Border" 
                                Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" 
                                DockPanel.Dock="Right" 
                                Background="WhiteSmoke" 
                                CornerRadius="0,3,3,0"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                >
                            <Path Fill="{TemplateBinding Foreground}"
                                  HorizontalAlignment="Center" VerticalAlignment="Center" Data="M0,0L4.5,4 9,0z"/>
                        </Border>
                    </DockPanel>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="Border" Property="Background" Value="White" />
                        </Trigger>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter TargetName="Border" Property="Background" Value="White" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Opacity" Value="0.5"/>
            </Trigger>
        </Style.Triggers>
    </Style>

    <ControlTemplate x:Key="ComboBoxTextBox" TargetType="{x:Type TextBox}">
        <Border x:Name="PART_ContentHost" Focusable="False" />
    </ControlTemplate>

    <Style x:Key="{x:Type ComboBox}"
           TargetType="{x:Type ComboBox}">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
        <Setter Property="ScrollViewer.CanContentScroll" Value="true" />
        <Setter Property="MinWidth" Value="120" />
        <Setter Property="MinHeight" Value="20" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ComboBox}">
                    <Border SnapsToDevicePixels="True" 
                            x:Name="OuterBorder" 
                            Background="Transparent" 
                            BorderBrush="Red" 
                            BorderThickness="1" 
                            CornerRadius="4"
                            Margin="-1">
                        <Border x:Name="InnerBorder" 
                                Background="WhiteSmoke" 
                                BorderThickness="1" 
                                CornerRadius="3" 
                                BorderBrush="Black">
                            <Grid>
                                <VisualStateManager.VisualStateGroups>
                                    <VisualStateGroup x:Name="EditStates">
                                        <VisualState x:Name="Editable">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)"
                                                                               Storyboard.TargetName="PART_EditableTextBox">
                                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
                                                </ObjectAnimationUsingKeyFrames>
                                                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)"
                                                                               Storyboard.TargetName="ContentSite">
                                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Hidden}" />
                                                </ObjectAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </VisualState>
                                        <VisualState x:Name="Uneditable" />
                                    </VisualStateGroup>
                                </VisualStateManager.VisualStateGroups>
                                <ToggleButton x:Name="ToggleButton"
                                              Margin="-1"
                                              Grid.Column="2"
                                              Focusable="False"
                                              ClickMode="Press"
                                              Style="{StaticResource ComboboxDropdownButton}"
                                              IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
                                </ToggleButton>
                                <ContentPresenter x:Name="ContentSite"
                                                  IsHitTestVisible="False"
                                                  Content="{TemplateBinding SelectionBoxItem}"
                                                  ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
                                                  ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
                                                  Margin="3,3,23,3"
                                                  VerticalAlignment="Stretch"
                                                  HorizontalAlignment="Left">
                                </ContentPresenter>
                                <TextBox x:Name="PART_EditableTextBox"
                                         Style="{x:Null}"
                                         Template="{StaticResource ComboBoxTextBox}"
                                         HorizontalAlignment="Left"
                                         VerticalAlignment="Bottom"
                                         Margin="3,3,23,3"
                                         Focusable="True"
                                         Background="Transparent"
                                         Visibility="Hidden"
                                         IsReadOnly="{TemplateBinding IsReadOnly}" />
                                <Popup x:Name="PART_Popup"
                                       Placement="Bottom"
                                       IsOpen="{TemplateBinding IsDropDownOpen}"
                                       AllowsTransparency="True"
                                       Focusable="False"
                                       PopupAnimation="Slide">
                                    <Grid x:Name="DropDown"
                                          SnapsToDevicePixels="True"
                                          MinWidth="{TemplateBinding ActualWidth}"
                                          MaxHeight="{TemplateBinding MaxDropDownHeight}"
                                          >
                                        <Border x:Name="DropDownBorder"
                                                MaxHeight="{TemplateBinding MaxDropDownHeight}"
                                                MinWidth="{Binding ActualWidth, ElementName=Border}" 
                                                Background="WhiteSmoke" 
                                                BorderBrush="Black" 
                                                BorderThickness="1" CornerRadius="0,0,3,3">
                                        </Border>
                                        <ScrollViewer Padding="1" SnapsToDevicePixels="True">
                                            <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
                                        </ScrollViewer>
                                    </Grid>
                                </Popup>
                            </Grid>
                        </Border>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="HasItems" Value="false">
                            <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95" />
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid>
    <ComboBox Width="120" Height="20" Name="comboBox1" SnapsToDevicePixels="True"
              HorizontalAlignment="Center" VerticalAlignment="Center"
              Text="ComboBox" SelectedIndex="0" IsEditable="True" IsReadOnly="True">
        <ComboBoxItem>item 1</ComboBoxItem>
        <ComboBoxItem>item 2</ComboBoxItem>
        <ComboBoxItem>item 3</ComboBoxItem>
    </ComboBox>
</Grid>

1 Ответ

0 голосов
/ 08 августа 2011

Я наконец решил это .. удалив границы из шаблона. Я заменил границы прямоугольниками в сетке шаблона. Работал как шарм. Результат можно найти в следующем вопросе здесь .

...