WPF中的自定义组合框控件在Windows 10和7上的行为有所不同

时间:2018-02-16 08:23:39

标签: c# wpf combobox windows-10

我目前正在开发一个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部分和下拉列表中都具有深灰色背景,如下面的屏幕所示。

Custom Combo Box

但在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>

2 个答案:

答案 0 :(得分:0)

似乎问题出现在控件模板中。它在Windows 7和Windows 10上使用不同的默认颜色。所以你应该做下一步:

  1. 打开Visual Studio编辑器
  2. 在某处添加你的组合框
  3. 右键单击编辑器中的可视元素:编辑模板=&gt;编辑副本 enter image description here
  4. VS生成新模板
  5. 使用颜色创建资源
  6. 在模板中更改

答案 1 :(得分:0)

我最终在短短几个小时内就弄清楚了如何做到这一点。

  1. 创建一个单独的资源字典以放入已编辑的模板。在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

  1. 将资源字典添加到您的xaml文件中。

    <Window.Resources>
      <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="..\path\to\CompatibleComboBox.xaml" />
        </ResourceDictionary.MergedDictionaries>
    

这将使其适用于下一步。

  1. 在@WinterMute的答案中进行所有操作,并将其放在您刚创建的资源字典中。这会将您的ComboBox中的样式引用添加到复制的模板中。
  2. 在资源字典中,找到其中带有Border的{​​{1}}。我的电话在第240行。
  3. TextBox属性更改为Background。这是最重要的部分。

但是现在您遇到了一个问题,因为它不能在Windows 7上运行。要解决此问题,我们不需要使用Aero2,它是在创建ComboBox模板副本时附带的。

  1. 删除对Background="{TemplateBinding Background}"的项目引用
  2. 改为添加PresentationFramework.Aero2
  3. PresentationFramework.Aero开头的引用从CompatibleComboBox.xaml更改为Aero2

您现在拥有一个具有可运行的Background属性的ComboBox,可在Windows 7、8和10中使用。