我目前正在开发一个WPF应用程序,它将部署在Windows 7和10上。在应用程序中有一个自定义的Combo Box控件:
<utils:FilteredComboBox
Height="28"
Background="#222222"
FontSize="14"
Foreground="White"
IsEditable="True"
IsEnabled="{Binding ElementsEnabled}"
IsTextSearchEnabled="False"
ItemsSource="{Binding Path=FlatItemSource, Mode=OneWay}"
SelectedItem="{Binding SelectedFlatItem}"
StaysOpenOnEdit="True">
<utils:FilteredComboBox.Style>
<Style>
<Setter Property="FrameworkElement.OverridesDefaultStyle" Value="False" />
</Style>
</utils:FilteredComboBox.Style>
<utils:FilteredComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel VirtualizationMode="Recycling" />
</ItemsPanelTemplate>
</utils:FilteredComboBox.ItemsPanel>
<utils:FilteredComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Style="{StaticResource CardValue}" Text="{Binding Name}" />
<TextBlock
FontSize="10"
Foreground="White"
Text="{Binding Comments}" />
</StackPanel>
</DataTemplate>
</utils:FilteredComboBox.ItemTemplate>
</utils:FilteredComboBox>
在Windows 7上,它通常在TextBox部分和下拉列表中都具有深灰色背景,如下面的屏幕所示。
但在Windows 10上,TextBox部分变为白色,而下拉列表仍为深灰色。对background属性进行任何更改都不会影响控件,但是例如更改Foreground会使文本变为不同的颜色。 在同一屏幕上还有其他组合框可以保持正确的颜色(它们是普通的组合框,而不是像这样的自定义组合框)。
我该如何解决这个问题?我已经尝试为控件创建自定义模板,但在尝试编辑模板的副本时,VS(2015)会返回一个错误,即复制模板失败。
下拉列表中使用的卡片值样式代码:
<Style x:Key="CardValue"
TargetType="TextBlock">
<Setter
Property="FontSize"
Value="14" />
<Setter
Property="FontFamily"
Value="Segoe UI" />
<Setter
Property="Foreground"
Value="White" />
</Style>
答案 0 :(得分:0)
似乎问题出现在控件模板中。它在Windows 7和Windows 10上使用不同的默认颜色。所以你应该做下一步:
答案 1 :(得分:0)
我最终在短短几个小时内就弄清楚了如何做到这一点。
创建一个单独的资源字典以放入已编辑的模板。在Visual Studio中没有选择创建其中一个的选项,但是我很确定这只是带有语法语法的重命名XML文件。我已经复制了一份。它应该看起来像这样:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:YourNamespace">
<!-- nothing here yet -->
</ResourceDictionary>
我们假设此文件名为CompatibleComboBox.xaml
。
将资源字典添加到您的xaml文件中。
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="..\path\to\CompatibleComboBox.xaml" />
</ResourceDictionary.MergedDictionaries>
这将使其适用于下一步。
Border
的{{1}}。我的电话在第240行。TextBox
属性更改为Background
。这是最重要的部分。但是现在您遇到了一个问题,因为它不能在Windows 7上运行。要解决此问题,我们不需要使用Aero2,它是在创建ComboBox模板副本时附带的。
Background="{TemplateBinding Background}"
的项目引用PresentationFramework.Aero2
。PresentationFramework.Aero
开头的引用从CompatibleComboBox.xaml
更改为Aero2
。您现在拥有一个具有可运行的Background属性的ComboBox,可在Windows 7、8和10中使用。