当我在 WPF 中创建自定义控件并将其添加到窗口时,我在对话框中看不到任何放置它的内容。这就是我正在做的:
- 创建一个新的 WPF 应用程序
- 添加 -> 新项目... -> 自定义控件 (WPF):“CustomButton.cs”
- 我将 CustomButton 基类更改为 Button 而不是 Control
- 将自定义按钮控件添加到我的主窗口。
- 当我运行应用程序或在设计器中查看主窗口时,我看不到任何内容。
代码如下所示。
自定义按钮.cs:
public class CustomButton : Button
{
static CustomButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton),
new FrameworkPropertyMetadata(typeof(CustomButton)));
}
}
主窗口.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>
通用.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 中的静态构造函数,按钮会突然出现在主窗口中。但它在所有情况下看起来都不太正确(就像我使用工具栏中的按钮一样)。
我想您同时已经找到了问题的解决方案。
但是,对于这种情况,其他人都会遇到与您相同的问题:
尽管创建自定义控件的所有步骤都已正确完成(如您所做的那样),但为什么自定义控件未显示的唯一解释可能是 AssemblyInfo.cs 中缺少条目。
该文件必须包含以下条目:
[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly))]
如果没有此条目,generic.xaml 文件将被忽略,因此找不到默认控件模板,因此控件根本不会获得控件模板,因此不会显示。这也解释了为什么当您禁用控件的静态构造函数时,控件突然出现。该行:
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton), new FrameworkPropertyMetadata(typeof(CustomButton)));
告诉控件使用它自己的默认样式,而不是从它的基类继承它。因此,如果没有这一行,CustomButton 将简单地重用 Button 类的默认控件模板,其结果是,您在 generic.xaml 中写入的任何内容都不会对 CustomButton 产生任何影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)