WPF 组合框透明背景不适用于 Windows 10

Luc*_*uca 0 wpf combobox background windows-8 windows-10

我必须通过后面的代码定义一个组合框:

var cmbLogin = new ComboBox()
{
    Width = 200,
    Height = m_dFontSize + 10,
    FontSize = m_dFontSize,
    Margin = new Thickness(20),
    BorderBrush = new SolidColorBrush(m_ExeCfg.GetForeground()),
    HorizontalContentAlignment = HorizontalAlignment.Center,
    Background = Brushes.Transparent,<--------------HERE
    Foreground = new SolidColorBrush(m_ExeCfg.GetForeground()),
    Focusable = true,
};
Run Code Online (Sandbox Code Playgroud)

所以背景在win7中变得透明,但在win10中不是。

我已经通过 xaml 看到了一些解决方案,但不能仅将它们应用到代码中。谢谢

mm8*_*mm8 6

您不能简单地设置 ComboBox 的 Background 属性来更改其在 Windows 8 和 10 上的背景。您需要按照此处的建议定义自定义控件模板:https : //blog.magnusmontin.net/2014/04/30 /change-the-background-colour-of-a-combobox-in-wpf-on-windows-8/

将默认模板复制到 XAML 标记中后,您可以将 ToggleButton 样式中“templateRoot”Border 元素的 Background 属性设置为 {TemplateBinding Background}

<ControlTemplate TargetType="{x:Type ToggleButton}">
                    <Border x:Name="templateRoot" BorderBrush="{StaticResource ComboBox.Static.Border}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
...
Run Code Online (Sandbox Code Playgroud)

然后,您必须将自定义样式应用到您以编程方式创建的 ComboBox:

var cmbLogin = new ComboBox()
{
    Width = 200,
    Height = m_dFontSize + 10,
    FontSize = m_dFontSize,
    Margin = new Thickness(20),
    BorderBrush = new SolidColorBrush(m_ExeCfg.GetForeground()),
    HorizontalContentAlignment = HorizontalAlignment.Center,
    Background = Brushes.Transparent,
    Foreground = new SolidColorBrush(m_ExeCfg.GetForeground()),
    Focusable = true,
    Style = Resources["ComboBoxStyle1"] as Style
};
Run Code Online (Sandbox Code Playgroud)

如果您真的,真的想要在不使用任何 XAML 标记的情况下执行此操作,则必须等到 ComboBox 加载完毕,然后在可视化树中找到 Border 元素并设置其 Background 属性:

var cmbLogin = new ComboBox()
{
    Width = 200,
    Height = m_dFontSize + 10,
    FontSize = m_dFontSize,
    Margin = new Thickness(20),
    BorderBrush = new SolidColorBrush(m_ExeCfg.GetForeground()),
    HorizontalContentAlignment = HorizontalAlignment.Center,
    Foreground = new SolidColorBrush(m_ExeCfg.GetForeground()),
    Focusable = true,
};

cmbLogin.Loaded += (ss, ee) => 
{
    var toggleButton = cmb.Template.FindName("toggleButton", cmbLogin) as System.Windows.Controls.Primitives.ToggleButton;
    if(toggleButton != null)
    {
        Border border = toggleButton.Template.FindName("templateRoot", toggleButton) as Border;
        if (border != null)
            border.Background = Brushes.Transparent;
    }
};
Run Code Online (Sandbox Code Playgroud)