2017-11-04 104 views
3

我在我想修改的UWP项目中有一个ComboBox。我想更改包含ComboBoxItemsStackPanel(?)的背景颜色,但我还没有找到实现此目的的简单方法。如何更改组合框下拉菜单背景?

在这里,我想要改变浅灰色填充的颜色。

Combobox open

颜色围绕ComboBoxItems应该匹配,而是它是代表了默认的灰色。

下面是一个示例,其中MSN Money的ComboBox具有与ComboBoxItems匹配的自定义填充颜色。这是我希望实现的。

MSN Money Combobox

我用的是“填充”,但它实际上是包含ComboBoxItems元素的只是颜色。

据我所知,我必须修改Windows 10 SDK中提供的generics.xaml文件,但会修改我使用的所有ComboBox es。我可以创建一个继承自ComboBox的自定义控件,但是当我想要改变这种颜色时,这不需要我编写新的控件?必须有一个更简单的方法来改变这一点。

@Bart这是我在ComboBox中的Popup模板中找到的代码。我不确定在你的解释中“SystemControlBackgroundChromeMediumLowBrush”来自哪里。

<Popup x:Name="Popup"> 
    <Border x:Name="PopupBorder" 
     Background="{ThemeResource ComboBoxDropDownBackground}" 
     BorderBrush="{ThemeResource ComboBoxDropDownBorderBrush}" 
     BorderThickness="{ThemeResource ComboBoxDropdownBorderThickness}" 

回答

2

您应该永远不要触摸SDK文件夹中的generics.xaml文件,这是一个“系统文件”。这就像更改Windows安装中的某个文件以更改图标浏览器(并可能导致其他应用程序更改此设置)。

有多种解决方案:

  • 在自己的应用程序Edit the control's template(与Visual Studio,混合或通过简单地复制default template如果你让它无名(命名通过设置x:Key模板)也将被应用。您所有ComboBox上课。如果你只想要一些改变,你应该给它一个密钥,并用它作为StaticResource

的一块你正在寻找的代码是在模板中的弹出式菜单控件。

<Popup x:Name="Popup"> 
    <Border 
     x:Name="PopupBorder" 
     Background="{ThemeResource SystemControlBackgroundChromeMediumLowBrush}" 
     BorderBrush="{ThemeResource SystemControlForegroundChromeHighBrush}" 
     BorderThickness="{ThemeResource ComboBoxDropdownBorderThickness}" 
     Margin="0,-1,0,-1" 
     HorizontalAlignment="Stretch"> 
  • 重写ThemeResource给它另一种颜色。请注意,这会对您的应用中的其他控件使用相同的ThemeResource产生影响。但是,这比改变generics.xaml和更少的工作比重新定义模板要好得多。

这是通过重新定义资源密钥完成的。

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.ThemeDictionaries> 
      <ResourceDictionary x:Key="Dark"> 
       <SolidColorBrush x:Key="SystemControlBackgroundChromeMediumLowBrush" Color="DarkGray" /> 
      </ResourceDictionary> 
     </ResourceDictionary.ThemeDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 
+0

第二个解决方案没有奏效,直到我意识到App.xaml有一行手动将RequestedTheme设置为Light,我立即将其删除。我试图创建一个模板,但是这对我的控件没有影响。 至于第一个XAML块,你从哪里复制的? – Mapplesoft

+0

XAML的第一个块来自默认模板(链接在答案中)。要使用自己创建的模板,请阅读答案中的链接,因为它应该可以工作(使用键+ StaticResource或重新定义应用中所有控件的默认模板)。但我很高兴你至少能够以第二种方式工作。 – Bart