WPF自定义控件不可见。

8
当我在WPF中创建自定义控件并将其添加到窗口中时,在对话框中放置的位置上看不到任何内容。这是我所做的:
  1. 创建一个新的WPF应用程序
  2. 添加 -> 新项目... -> 自定义控件(WPF):"CustomButton.cs"
  3. 我将CustomButton基类从Control更改为Button
  4. 将CustomButton控件添加到我的主窗口。
  5. 当我运行应用程序或查看设计器中的主窗口时,我什么也看不到。
下面是代码样式。
CustomButton.cs:
public class CustomButton : Button
{
    static CustomButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton),
            new FrameworkPropertyMetadata(typeof(CustomButton)));
    }
}

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:WpfApplication1">
    <Grid>
        <my:CustomButton Content="Hello World" x:Name="customButton1"
                         HorizontalAlignment="Left" VerticalAlignment="Top" Margin="150,175,0,0" />
    </Grid>
</Window>

Generic.xaml:

<Style TargetType="{x:Type local:CustomButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomButton}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我找到了两个线索,但还没有找到答案。当我添加自定义控件时,Visual Studio会添加Themes/Generic.xaml文件,但无论我在那里尝试什么,屏幕上都看不到任何区别。另一件事是,如果我注释掉CustomButton.cs中的静态构造函数,突然间按钮就出现在主窗口中了。但在某些情况下它看起来不太对(比如我在工具栏中使用该按钮)。

2个回答

15

我想你在此期间已经找到了解决方案。 然而,如果其他人遇到与你相同的问题: 自定义控件未显示的唯一可能原因是缺少AssemblyInfo.cs中的条目,即使所有创建它的步骤都已正确执行(如你所做)。 此文件必须包含以下条目:

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly))]

如果没有这个入口,通用.xaml文件将被忽略,因此默认的控件模板无法找到,因此该控件将不会获得控件模板,也就无法显示。这也解释了为什么在禁用静态构造函数后您的控件突然出现的原因。以下是该行代码:

DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton), new FrameworkPropertyMetadata(typeof(CustomButton)));

告诉控件使用自己的默认样式而不是从其基类继承它。因此,如果没有这行代码,CustomButton将简单地重用Button类的默认控件模板,结果是,您在generic.xaml中编写的任何内容都对CustomButton没有任何影响。

我无法确认这个问题,我在AssemblyInfo文件中有条目,但仍然无法解决。 - flibbo
1
该死,这就是我的问题所在,忘记在资源中包含样式文件了。谢谢! - Starwave
1
这个答案救了我的命!谢谢。 - dgxhubbard

14

您的自定义控件模板在哪里?

说了这句话,

      DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton),
        new FrameworkPropertyMetadata(typeof(CustomButton)));

您正在指示要定义自己的自定义控件。我认为如果您删除这一部分,您就会看到您的按钮。


你说得对,当我移除它时它就出现了。不过,它会添加Generic.xaml,其中包含自定义控件模板。我也已经将其添加到主要问题中了。 - Jason
2
它看起来不像一个模板 :) 它只会画出一个(可能为空的)边框。 - Jeff
1
另外,这似乎并不像你想在这里创建一个自定义控件...是吗?看起来你只是想要一个自定义的 Button 子类。 - Jeff
好的,我想我明白了。需要更深入地研究样式。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接