2013-08-01 2 views
3

У меня есть глобальный стиль, определенный для выпадающего списка в App.xaml, как показано ниже:WPF переопределен, когда пользовательский стиль применяется

<Style x:Key="{x:Type ComboBox}" TargetType="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="MinHeight" Value="20"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ComboBox"> 
       <Grid Width="{TemplateBinding Width}"> 
        <ToggleButton 
             Name="ToggleButton" 
             Template="{StaticResource ComboBoxToggleButton}" 
             Grid.Column="2" 
             Focusable="false" 
             IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}" 
             ClickMode="Press"> 
        </ToggleButton> 
        <ContentPresenter 
             Name="ContentSite" 
             IsHitTestVisible="False" 
             Content="{TemplateBinding SelectionBoxItem}" 
             ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" 
             ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" 
             Margin="3,3,23,3" 
             VerticalAlignment="Center" 
             HorizontalAlignment="Left" /> 
        <TextBox x:Name="PART_EditableTextBox" 
             Style="{x:Null}" 
             Template="{StaticResource ComboBoxTextBox}" 
             HorizontalAlignment="Left" 
             VerticalAlignment="Center" 
             Margin="3,3,23,3" 
             Focusable="True" 
             Background="Transparent" 
             Visibility="Hidden" 
             IsReadOnly="{TemplateBinding IsReadOnly}"/> 
        <Popup 
             Name="Popup" 
             Placement="Bottom" 
             IsOpen="{TemplateBinding IsDropDownOpen}" 
             AllowsTransparency="True" 
             Focusable="False" 
             PopupAnimation="Slide"> 
         <Grid 
              Name="DropDown" 
              SnapsToDevicePixels="True"     
              MinWidth="{TemplateBinding ActualWidth}" 
              MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
          <Border x:Name="DropDownBorder" Background="{StaticResource BackgroundBrush}" /> 
          <ScrollViewer Margin="4,4,4,4" SnapsToDevicePixels="True" Style="{StaticResource DropDownScrollViewer}"> 
           <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" /> 
          </ScrollViewer> 
         </Grid> 
        </Popup> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="HasItems" Value="false"> 
         <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/> 
        </Trigger> 
        <Trigger Property="IsGrouping" Value="true"> 
         <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
        </Trigger> 
        <Trigger Property="IsEditable" Value="true"> 
         <Setter Property="IsTabStop" Value="false"/> 
         <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible"/> 
         <Setter TargetName="ContentSite" Property="Visibility" Value="Hidden"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Затем я создаю выпадающий в элементе управления:

<ComboBox Name="DataTypeSelector" ItemsSource="{Binding ElementName=DataItemsBuildWindow, Path=DataContext.Types}" SelectedValue="{Binding DataType}" HorizontalAlignment="Stretch" />          

стиль применяется, как ожидалось.

Если я изменил свой combobox в элементе управления на нижеследующее, то combobox вернется к своему оригинальному стилю, а ширина и триггеры определит работу. Кажется, что новый глобальный стиль игнорируется.

<ComboBox Name="DataTypeSelector" ItemsSource="{Binding ElementName=DataItemsBuildWindow, Path=DataContext.Types}" SelectedValue="{Binding DataType}" HorizontalAlignment="Stretch"> 
            <ComboBox.Style> 
             <Style TargetType="ComboBox"> 
              <Setter Property="Width" Value="160"></Setter> 
              <Style.Triggers> 
               <DataTrigger Value="List" Binding="{Binding SelectedValue, ElementName=DataTypeSelector, Converter={StaticResource ToStringConverter}}"> 
                <Setter Property="Width" Value="80" /> 
               </DataTrigger> 
              </Style.Triggers> 
             </Style> 
            </ComboBox.Style> 
           </ComboBox> 

Как я могу сохранить глобальный стиль, но также применять настраиваемые триггеры?

ответ

12

Вы должны основывать новый стиль на существующем стиле по умолчанию:

<ComboBox.Style> 
    <Style TargetType="ComboBox" 
      BasedOn="{StaticResource ResourceKey={x:Type ComboBox}}"> 
     ... 
    </Style> 
</ComboBox.Style> 

Кстати, не нужно, чтобы установить ключ стиля по умолчанию в словаре ресурсов в приложении. XAML. Если вы укажете TargetType="ComboBox", по умолчанию этот ключ установлен в этот тип. Так что этого достаточно:

<Style TargetType="ComboBox"> 
    ... 
</Style> 
+0

Спасибо, что сработало. Есть ли способ полностью переопределить стиль по умолчанию для моего приложения, поэтому мне не нужно это делать? – VARAK

+1

Не уверен, что вы имеете в виду. У вас уже есть стиль по умолчанию для ComboBox. Так что еще можно переопределить? – Clemens

+0

Правильно, это имеет смысл ... Я все еще считаю WPFstyling :) Спасибо! – VARAK