【问题标题】:ContentPresenter not displaying Custom Control in StyleContentPresenter 未以样式显示自定义控件
【发布时间】:2016-11-18 13:10:26
【问题描述】:

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

当我使用按钮作为基本示例时,我可以很好地扩展 ControlTemplate。原始 Button 显示在 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>

【问题讨论】:

    标签: c# wpf custom-controls contentpresenter


    【解决方案1】:

    一些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>
    

    【讨论】:

    • 抱歉问题不清楚。自定义控件也有默认样式。我会把它添加到问题中。
    • 更新了我的答案。
    • 为快速回答干杯。我尝试了您提到的内容,但即使使用最基本的测试和没有部件的默认样式,ContentPresenter 也不会显示任何内容。
    • 我已经编辑了一个示例 ControlTemplate 来玩。
    • 是的,这是一个解决方案,但我试图避免太多重复的 XAML 以提高可维护性。所以我希望重用默认样式的 ControlTemplate,而不需要在命名样式的 ControlTemplate 中复制粘贴。但是我想我意识到了这个问题,如果我理解正确,ContentPresenter 不会显示整个控件?
    猜你喜欢
    • 2016-08-18
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多