gpt4 book ai didi

wpf - 在 WPF 中优雅地覆盖 ComboBox 的 ToggleButton 样式

转载 作者:行者123 更新时间:2023-12-03 20:55:15 24 4
gpt4 key购买 nike

我有一个关于如何优雅地覆盖控件可视树深处的任意元素的问题。我还尝试以几种不同的方式解决它,但每种方式都遇到了几个问题。通常,当我尝试三种不同的方法但每一种都失败时,我会下楼喝杯咖啡,然后问一个比我更聪明的人。所以我来了。

规范:

我想展平组合框的样式,使其不会引起人们的注意。我希望它类似于 Windows.Forms.ComboBox 的 FlatStyle 我希望它在 Windows 7 和 XP 上看起来相同。

主要是,我想更改 ComboBox 的 ToggleButton 的外观。

我可以只使用 Blend 并撕掉控制模板的内脏并手动更改它们。这对我来说听起来不是很开胃。

我尝试使用样式来覆盖 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>

所以我放弃了并使用 Blend 撕掉了它。我发现它实际上是一个名为 ComboBoxTransparentButtonStyle 的样式,目标类型为 ToggleButton。该样式设置了一个 ControlTemplate,它使用一个 DockPanel,该 DockPanel 的右侧设置了“Microsoft_Windows_Themes:ClassicBorderDecorator”类型,这就是我们实际想要控制的。 (到目前为止你和我在一起吗?)
这是图片:

Example
<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>

Arg。 WPF不是爆炸吗?

所以我提取了样式 ComboBoxTransparentButtonStyle 并将其放入另一个项目的 application.resources 中。问题是我无法将该样式应用于 ComboBox,因为我提取的样式具有 ToggleButton 的 targetType,因此 TargeTypes 不匹配。

tl;dr 你们会怎么做?

最佳答案

对此没有优雅的解决方案。您能做的最好的事情是覆盖整个 ComboBox 的样式,以便您可以更改它为 ToggleButton 设置的样式。

您可以使用 Blend 来获取样式,但这可能不是最简单的方法。如果您安装了 Blend,请转到“[程序文件或 Blend 的安装位置]\SystemThemes\WPF\areo.normalcolor.xaml”。

关于wpf - 在 WPF 中优雅地覆盖 ComboBox 的 ToggleButton 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1799974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com