在 wpf 中应用样式时,用户控件内的组合框消失

Posted

技术标签:

【中文标题】在 wpf 中应用样式时,用户控件内的组合框消失【英文标题】:combo box inside a user control disappears when style is applied in wpf 【发布时间】:2011-04-09 04:06:28 【问题描述】:

我正在尝试将样式应用于组合框,但组合框本身消失了,而不是被应用。请检查以下 xaml 代码进行用户控制。

触发器> 控制模板> 二传> 样式> 标签> 画布> 用户控制>

这里的PASCustomComboBox是一个继承自组合框的类。

public class PASCustomComboBox : ComboBox

    protected override void OnPreviewKeyDown(KeyEventArgs e)
    
        if (e.Key == Key.Down || e.Key == Key.Up)
        
            e.Handled = true;
            return;
        

        base.OnPreviewKeyDown(e);
    

【问题讨论】:

【参考方案1】:

你没有在你的风格的控制模板中指定任何视觉元素,只是一个触发器。 它将呈现空模板 iirc。

最好以您的风格编辑 ComboBox 的 Trigger 集合以添加该触发器,并且您将保留默认 ControlTemplate。

【讨论】:

【参考方案2】:

问题是您正在重新定义 ControlTemplate 中没有任何可视化树:

<Style x:Key="comboBoxStyle" TargetType="x:Type local:PASCustomComboBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="x:Type local:PASCustomComboBox">
                <ControlTemplate.Triggers>
                    <Trigger Property="local:PASCustomComboBox.IsEnabled" Value="false">
                        <Setter Property="Background" Value="Red"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

您需要样式上的触发器而不是控件模板:

<Style x:Key="comboBoxStyle" TargetType="x:Type local:PASCustomComboBox">
    <Style.Triggers>
        <Trigger Property="local:PASCustomComboBox.IsEnabled" Value="false">
            <Setter Property="Background" Value="Red"/>
        </Trigger>
    </Style.Triggers>
</Style>

【讨论】:

以上是关于在 wpf 中应用样式时,用户控件内的组合框消失的主要内容,如果未能解决你的问题,请参考以下文章

从 wpf 页面中的组合框(在用户控件中)获取数据

尝试在 WPF 中设置组合框的背景

在 wpf 中的自定义样式上,文本框的文本始终为空

为啥在 tabcontrol 内的 WPF 文本框中单击时,Windows 10 键盘会出现并立即消失?

WPF - 根据项目模板更改组合框样式

WPF DataGrid 动态样式