ContentControl 不显示 ControlTemplate 中的内容
ContentControl does not show content in ControlTemplate
我需要创建一个类似于 WPF GroupBox 的自定义控件。我从 VS 2015 中的标准 WPF 自定义控件库模板开始,像这样定义我的 CustomGroupBox 控件:
public class CustomGroupBox : ContentControl
{
static CustomGroupBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomGroupBox), new FrameworkPropertyMetadata(typeof(CustomGroupBox)));
}
}
然后根据规范添加了以下最少的行来开发我的自定义 GroupBox:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomGroupBox">
<Style TargetType="{x:Type local:CustomGroupBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomGroupBox}">
<Border Background="{TemplateBinding Background}"
BorderBrush="Gray" BorderThickness="3" CornerRadius="3">
<ContentControl />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
为了调试和开发,我为我的自定义控件创建了一个测试表单:
<Window x:Class="CustomGroupBoxClient.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CustomGroupBoxClient"
xmlns:ctrl="clr-namespace:CustomGroupBox;assembly=CustomGroupBox"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ctrl:CustomGroupBox Margin="5">
<StackPanel Orientation="Vertical">
<TextBlock>Text Block #1</TextBlock>
<TextBlock>Text Block #2</TextBlock>
</StackPanel>
</ctrl:CustomGroupBox>
</Grid>
</Window>
但是,当我启动此表单时,我看到自定义控件的边框但看不到内容(2 个 TextBlock 的):
我已经重新阅读了很多与此主题相关的手册和文章,但仍然无法弄清楚为什么我的 ControlTemplate 中的 ContentControl 没有显示指定的内容。如何解决我的问题?
尝试在模板中使用 ContentPresenter
而不是 ContentControl
:
<ContentPresenter />
默认情况下,ContentPresenter
查找其模板化父项的 Content
属性 并显示在那里找到的任何内容。您可以通过更改其 ContentSource
值来更改其查找的 属性 的名称...
<ContentPresenter ContentSource="FooBar" />
...但是由于您继承自 ContentControl
,默认值可能就是您想要的。
我需要创建一个类似于 WPF GroupBox 的自定义控件。我从 VS 2015 中的标准 WPF 自定义控件库模板开始,像这样定义我的 CustomGroupBox 控件:
public class CustomGroupBox : ContentControl
{
static CustomGroupBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomGroupBox), new FrameworkPropertyMetadata(typeof(CustomGroupBox)));
}
}
然后根据规范添加了以下最少的行来开发我的自定义 GroupBox:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomGroupBox">
<Style TargetType="{x:Type local:CustomGroupBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomGroupBox}">
<Border Background="{TemplateBinding Background}"
BorderBrush="Gray" BorderThickness="3" CornerRadius="3">
<ContentControl />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
为了调试和开发,我为我的自定义控件创建了一个测试表单:
<Window x:Class="CustomGroupBoxClient.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CustomGroupBoxClient"
xmlns:ctrl="clr-namespace:CustomGroupBox;assembly=CustomGroupBox"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ctrl:CustomGroupBox Margin="5">
<StackPanel Orientation="Vertical">
<TextBlock>Text Block #1</TextBlock>
<TextBlock>Text Block #2</TextBlock>
</StackPanel>
</ctrl:CustomGroupBox>
</Grid>
</Window>
但是,当我启动此表单时,我看到自定义控件的边框但看不到内容(2 个 TextBlock 的):
我已经重新阅读了很多与此主题相关的手册和文章,但仍然无法弄清楚为什么我的 ControlTemplate 中的 ContentControl 没有显示指定的内容。如何解决我的问题?
尝试在模板中使用 ContentPresenter
而不是 ContentControl
:
<ContentPresenter />
默认情况下,ContentPresenter
查找其模板化父项的 Content
属性 并显示在那里找到的任何内容。您可以通过更改其 ContentSource
值来更改其查找的 属性 的名称...
<ContentPresenter ContentSource="FooBar" />
...但是由于您继承自 ContentControl
,默认值可能就是您想要的。