ContentPresenter没有在样式中显示自定义控件

本文关键字:显示 自定义控件 样式 ContentPresenter | 更新日期: 2023-09-27 18:18:32

我有一个自定义控件NumericUpDown。我创建了一个命名样式,我想在其中扩展控件,在本例中,通过将其包装在Grid中并添加Label。

当我使用按钮作为一个基本的例子时,我可以在ControlTemplate上进行扩展。原来的按钮显示在ContentPresenter的位置,我可以在它周围添加其他控件,用于布局和其他。

ControlTemplate TargetType="{x:Type Button}">
    <Border BorderThickness="3" BorderBrush="Red" Background="{TemplateBinding Background}">
        <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/>
    </Border>
</ControlTemplate>

然而,当使用我的自定义控件时,ContentPresenter不显示NumericUpDown控件,它完全没有显示。即使在最基本的形式中,我也无法让ContentPresenter显示自定义控件。

<Style x:Key="LabeledNumericUpDown2"  TargetType="{x:Type controls:NumericUpDown}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:NumericUpDown}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="5*"/>
                        <ColumnDefinition Width="5*"/>
                    </Grid.ColumnDefinitions>
                    <Label Grid.Column="0" Content="Blabla"/>
                    <ContentPresenter Grid.Column="1"/>
                    <!--<controls:NumericUpDown Grid.Column="1"/>-->
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我怎么也想不出我错过了什么。

谢谢你的帮助,非常感谢!

编辑

NumericUpDown自定义控件也有一个定义NumericUpDown控件的默认样式。我希望在此基础上扩展命名样式。

<Style TargetType="{x:Type controls:NumericUpDown}">
    <Setter Property="HorizontalAlignment" Value="Stretch"/>
    <Setter Property="VerticalAlignment" Value="Top" />
    <Setter Property="Margin" Value="0" />
    <Setter Property="Height" Value="18" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:NumericUpDown}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="16" />
                    </Grid.ColumnDefinitions>
                    <TextBox x:Name="PART_TextBox" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Top" Padding="0" Margin="0" 
                        Text="{Binding DisplayValue, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" />
                    <Border Grid.Column="1" BorderThickness="0 1 1 1" BorderBrush="#FFABADB3">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="8" />
                                <RowDefinition Height="8" />
                            </Grid.RowDefinitions>
                            <Button x:Name="PART_ButtonUp" Grid.Row="0" Content="▲" FontSize="4" HorizontalContentAlignment="Left" VerticalContentAlignment="Top" BorderThickness="0" Padding="6 1 0 0" />
                            <Button x:Name="PART_ButtonDown" Grid.Row="1" Content="▼" FontSize="4" HorizontalContentAlignment="Left" VerticalContentAlignment="Top" BorderThickness="0" Padding="6 1 0 0" />
                        </Grid>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

ContentPresenter没有在样式中显示自定义控件

一些Controls定义并期望特定的命名元素正确地工作,否则称为部件。

确保你的ControlTemplate已经为Control提供了所需的部件,以使其正确渲染。

编辑:

试试这个ControlTemplate让你开始。

<ControlTemplate TargetType="{x:Type controls:NumericUpDown}">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="5*"/>
            <ColumnDefinition Width="5*"/>
        </Grid.ColumnDefinitions>
        <Label Grid.Column="0" Content="Blabla"/>
        <Grid Grid.Column="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="16" />
            </Grid.ColumnDefinitions>
            <TextBox x:Name="PART_TextBox" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Top" Padding="0" Margin="0" 
                Text="{Binding DisplayValue, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" />
            <Border Grid.Column="1" BorderThickness="0 1 1 1" BorderBrush="#FFABADB3">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="8" />
                        <RowDefinition Height="8" />
                    </Grid.RowDefinitions>
                    <Button x:Name="PART_ButtonUp" Grid.Row="0" Content="▲" FontSize="4" HorizontalContentAlignment="Left" VerticalContentAlignment="Top" BorderThickness="0" Padding="6 1 0 0" />
                    <Button x:Name="PART_ButtonDown" Grid.Row="1" Content="▼" FontSize="4" HorizontalContentAlignment="Left" VerticalContentAlignment="Top" BorderThickness="0" Padding="6 1 0 0" />
                </Grid>
            </Border>
        </Grid>
    </Grid>
</ControlTemplate>