【问题标题】:WPF ComboBox Subclass can't find StyleWPF ComboBox 子类找不到样式
【发布时间】:2017-06-28 09:44:34
【问题描述】:

我有一个 Combobox 的子类,具有自定义样式。到目前为止它正在工作,但视觉工作室的设计师无法显示我的组合框的设计视图。

错误信息: 由于 MyResourceLib.Controls.MyComboBox 的问题,无法显示元素“[MyComboBox]”: 无法创建“MyComboBox”的实例

这是我的 ComboBox 的一个最小示例:

using System.Windows.Controls;

namespace MyResourceLib.Controls
{
    public partial class MyComboBox : ComboBox
    {
        public MyComboBox()
        {
            InitializeComponent();

        }
    }
}

XAML:

<ComboBox
    x:Class="MyResourceLib.Controls.MyComboBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyResourceLib.Controls"
    Style="{StaticResource StyleComboBox}">
    <ComboBox.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../Styles/ComboBoxes.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </ComboBox.Resources>
</ComboBox>

除此之外,我在使用组合框元素时遇到错误:

找不到名为“StyleComboBox”的资源。资源名称区分大小写。

具有讽刺意味的是,它在运行时使用样式...

谁能帮帮我?

【问题讨论】:

    标签: c# wpf xaml combobox


    【解决方案1】:

    你做错了。 MyComboBox 应该是一个没有任何 XAML 文件的普通类:

    public class MyComboBox : ComboBox
    {
        static MyComboBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MyComboBox),
                new System.Windows.FrameworkPropertyMetadata(typeof(MyComboBox)));
        }
    
        public MyComboBox()
        {
    
        }
    }
    

    然后,您可以在名为 Generic.xamlResourceDictionary 中定义自定义控件的默认样式,该文件夹位于项目根目录下名为 Themes 的文件夹中:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:local="clr-namespace:WpfApplication1">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Styles/ComboBoxes.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <Style TargetType="local:MyComboBox" BasedOn="{StaticResource YourComboBoxStyle}">
        </Style>
    </ResourceDictionary>
    

    这些名称是约定俗成的,这是您为自定义控件定义默认样式的方式。再做一次——做对。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多