У меня есть вопрос относительно того, как изящно переопределить произвольный элемент глубоко в визуальном дереве управления. Я также попытался разрешить его несколькими различными способами, но я столкнулся с несколькими проблемами с каждым. Обычно, когда я пробую три различных пути и сбой в каждом, который я иду вниз, имею кофе и спрашиваю кого-то более умного, чем я. Так я здесь
Специфические особенности:
Я хочу сгладить стиль поля комбинированного списка так, чтобы он не привлекал внимание к себе. Я хочу, чтобы это было подобно Windows. Формы. FlatStyle ComboBox я хочу, чтобы это выглядело одинаково в Windows 7 и XP.
Главным образом я хочу изменить вид ToggleButton ComboBox.
Я мог просто использовать Смешение и сорвать кишки шаблона управления и вручную изменить их. Это не звучит очень аппетитным мне.
Я пытался использовать стиль для переопределения истории ToggleButton, но оказывается, что целое управление ComboBox является на самом деле передней стороной для ToggleButton.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ComboBoxExpiriment2.MainWindow"
x:Name="Window"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Classic" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="204" Height="103">
<Grid x:Name="LayoutRoot">
<ComboBox HorizontalAlignment="Left" Margin="32,26.723,0,0" Width="120" VerticalAlignment="Top" Height="21.277">
<ComboBox.Style>
<Style>
<Setter Property="ToggleButton.Background" Value="Green" />
</Style>
</ComboBox.Style>
</ComboBox>
</Grid>
Таким образом, я сдался и разорвал его с помощью Смешения. Я нашел, что это - на самом деле Стиль под названием ComboBoxTransparentButtonStyle с целевым типом ToggleButton. Стиль устанавливает ControlTemplate, который использует DockPanel, который имеет набор типа "Microsoft_Windows_Themes:ClassicBorderDecorator" направо, и это - то, чем мы на самом деле пытаемся управлять. (Вы со мной до сих пор?)
Вот рис.:
<Style x:Key="ComboBoxTransparentButtonStyle" TargetType="{x:Type ToggleButton}">
<Setter Property="MinWidth" Value="0"/>
<Setter Property="MinHeight" Value="0"/>
<Setter Property="Width" Value="Auto"/>
<Setter Property="Height" Value="Auto"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="{x:Static Microsoft_Windows_Themes:ClassicBorderDecorator.ClassicBorderBrush}"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<DockPanel SnapsToDevicePixels="true" Background="{TemplateBinding Background}" LastChildFill="false">
<Microsoft_Windows_Themes:ClassicBorderDecorator x:Name="Border" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" DockPanel.Dock="Right" Background="Green" BorderBrush="{TemplateBinding BorderBrush}" BorderStyle="None" BorderThickness="{TemplateBinding BorderThickness}">
<Path Fill="{TemplateBinding Foreground}" HorizontalAlignment="Center" VerticalAlignment="Center" Data="{StaticResource DownArrowGeometry}"/>
</Microsoft_Windows_Themes:ClassicBorderDecorator>
</DockPanel>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="true">
<Setter Property="BorderStyle" TargetName="Border" Value="AltPressed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>
</Trigger>
</Style.Triggers>
</Style>
Аргумент не Является WPF уничтожение?
Таким образом, я извлек стиль ComboBoxTransparentButtonStyle и бросил его в application.resources другого проекта. Проблема, я не могу применить тот стиль к ComboBox, потому что стиль, который я извлек, имеет targetType ToggleButton, таким образом, TargeTypes не соответствуют.
tl; доктор, как был бы Вы парни, делает это?