如何将 ContentPropertyAttribute 设置为内容演示者?

发布于 2024-09-11 12:00:59 字数 8474 浏览 7 评论 0原文

我有一个用户控件:SnazzyForm,它除了几个边框和一个标题区域等之外,还有一个内容演示器,它在 .NET Framework 3.5 下以使用该控件的其他形式呈现传递给它的内容。

然而,在将项目移至 4.0 后,我遇到了“无法将内容添加到类型对象”等等等等。

该控件的代码隐藏如下:

Imports System
Imports System.IO
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Data
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.ComponentModel
Public Class SnazzyForm
    Inherits ContentControl

    Public Shared TitleProperty As DependencyProperty = DependencyProperty.Register("Title", GetType(String), GetType(SnazzyForm))

    <Description("Title to display"), _
        Category("Custom")> _
    Public Property Title() As String
        Get
            Return CType(GetValue(TitleProperty), String)
        End Get
        Set(ByVal value As String)
            SetValue(TitleProperty, value)
        End Set
    End Property

    Shared Sub New()
        ' Insert code required on object creation below this point.
        DefaultStyleKeyProperty.OverrideMetadata(GetType(SnazzyForm), New FrameworkPropertyMetadata(GetType(SnazzyForm)))
    End Sub
End Class

管理该控件的资源字典中的模板如下:

<Style TargetType="{x:Type local:SnazzyForm}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:SnazzyForm}">
                    <ControlTemplate.Resources>
                        <Style TargetType="{x:Type Border}" x:Key="formOuterBorderStyle">
                            <Setter Property="Margin" Value="22,22,22,3" />
                            <Setter Property="Padding" Value="0" />
                            <Setter Property="BorderBrush" Value="{StaticResource BrushBorder}" />
                            <Setter Property="BorderThickness" Value="3" />
                            <Setter Property="Background" Value="{StaticResource BrushBackgroundDark}" />
                            <Setter Property="CornerRadius" Value="20,20,0,0" />
                        </Style>
                        <Style TargetType="{x:Type TextBlock}" x:Key="formTitleStyle">
                            <Setter Property="Foreground" Value="{StaticResource BrushWhiteSmoke}" />
                            <Setter Property="FontFamily" Value="Verdana" />
                            <Setter Property="FontSize" Value="16" />
                            <Setter Property="Padding" Value="11,7,7,7" />
                            <Setter Property="VerticalAlignment" Value="Stretch" />
                            <Setter Property="HorizontalAlignment" Value="Stretch" />
                        </Style>
                        <Style TargetType="{x:Type TextBlock}" x:Key="formBreadcrumbStyle">
                            <Setter Property="Foreground" Value="{StaticResource BrushWhiteSmoke}" />
                            <Setter Property="FontFamily" Value="Verdana" />
                            <Setter Property="FontSize" Value="11" />
                            <Setter Property="Padding" Value="7" />
                            <Setter Property="VerticalAlignment" Value="Stretch" />
                            <Setter Property="HorizontalAlignment" Value="Stretch" />
                        </Style>

                        <Style TargetType="{x:Type Rectangle}" x:Key="formBackgroundRectangleStyle">
                            <Setter Property="Fill" Value="{StaticResource BrushABCLight}" />
                        </Style>

                        <Style TargetType="{x:Type Border}" x:Key="formTitleBorderStyle">
                            <Setter Property="BorderBrush" Value="{StaticResource BrushBlack}" />
                            <Setter Property="BorderThickness" Value="0,0,0,2" />
                        </Style>

                    </ControlTemplate.Resources>
                    <AdornerDecorator d:DesignWidth="640" d:DesignHeight="480">
                        <Grid Width="Auto" Height="Auto">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="40"/>
                                <RowDefinition Height="40"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="40"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock HorizontalAlignment="Left" Margin="0" VerticalAlignment="Top" FontFamily="Arial" FontSize="18.667" Foreground="#FFE0E0E0" Text="{TemplateBinding Title}" TextWrapping="Wrap" Panel.ZIndex="2" Visibility="Collapsed"/>
                            <Path Fill="Black" Stretch="Fill" Stroke="{x:Null}" Margin="0" VerticalAlignment="Stretch" Height="Auto" Grid.Column="1" Grid.Row="0" Data="M0.5,0.5 L39.5,39.5 0.5,39.5 z"/>
                            <Border Background="Black" Margin="0" VerticalAlignment="Stretch" Height="Auto" Grid.Row="0" CornerRadius="10,0,0,0"/>
                            <!-- <Rectangle Fill="Black" Stroke="Black" Margin="0" VerticalAlignment="Stretch" Height="Auto" Grid.Row="0"/> -->
                            <Rectangle Stroke="{x:Null}" Margin="0" Height="Auto" Opacity="0.5" Grid.ColumnSpan="2" Grid.Row="3" Grid.RowSpan="1">
                                <Rectangle.Fill>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#FF222222" Offset="0"/>
                                        <GradientStop Color="#FFB3B3B3" Offset="1"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                            <Rectangle Fill="Black" Stroke="Black" Margin="0" Grid.ColumnSpan="2" Grid.Row="1"/>
                            <Rectangle Fill="{TemplateBinding Background}" Stroke="Black" Margin="0" Height="Auto" Panel.ZIndex="-7" Grid.ColumnSpan="2" Grid.Row="2" Grid.RowSpan="1"/>
                            <Border x:Name="bdr" Style="{StaticResource formOuterBorderStyle}" Margin="0" Grid.ColumnSpan="2" Grid.RowSpan="3" d:LayoutOverrides="Width, Height" d:IsHidden="True" Visibility="Collapsed"/>
                            <Grid Margin="3" Grid.ColumnSpan="2" Grid.RowSpan="3">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" MinHeight="77" />
                                    <RowDefinition MinHeight="400" />
                                </Grid.RowDefinitions>
                                <Border Style="{StaticResource formTitleBorderStyle}" BorderBrush="{x:Null}">
                                    <StackPanel Margin="0">
                                        <TextBlock Text="{Binding ViewModelFriendlyName}" Style="{StaticResource formTitleStyle}" />
                                        <TextBlock Margin="11,0,0,0" Text="{Binding BreadcrumbTrail}" Style="{StaticResource formBreadcrumbStyle}" />
                                    </StackPanel>
                                </Border>
                                <Rectangle Grid.Row="1" Style="{StaticResource formBackgroundRectangleStyle}" Visibility="Collapsed" />

                                <!--Put the form below here-->
                                <ContentPresenter x:Name="ContentPresenterX" Grid.Row="1" Margin="0" />    
                                <!--Put the form above here-->

                            </Grid>
                        </Grid>
                    </AdornerDecorator>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

我想我真的只是想知道为什么我现在必须告诉控件使用 contentpresenter 来呈现内容,而以前它知道这就是我想要的,也是我如何做到的。

有什么想法吗?

科里

I have a Usercontrol: SnazzyForm, which in addition to a couple of borders and and a header area and whatnot, also has a Content Presenter which under .NET Framework 3.5 presented content passed to it in other forms that used the control just fine.

However after moving the project to 4.0 I am greeted with "Cannot add content to object of type" blah blah blah.

The codebehind for the control is thus:

Imports System
Imports System.IO
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Data
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.ComponentModel
Public Class SnazzyForm
    Inherits ContentControl

    Public Shared TitleProperty As DependencyProperty = DependencyProperty.Register("Title", GetType(String), GetType(SnazzyForm))

    <Description("Title to display"), _
        Category("Custom")> _
    Public Property Title() As String
        Get
            Return CType(GetValue(TitleProperty), String)
        End Get
        Set(ByVal value As String)
            SetValue(TitleProperty, value)
        End Set
    End Property

    Shared Sub New()
        ' Insert code required on object creation below this point.
        DefaultStyleKeyProperty.OverrideMetadata(GetType(SnazzyForm), New FrameworkPropertyMetadata(GetType(SnazzyForm)))
    End Sub
End Class

The template in the resourcedictionary that governs this control is thus:

<Style TargetType="{x:Type local:SnazzyForm}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:SnazzyForm}">
                    <ControlTemplate.Resources>
                        <Style TargetType="{x:Type Border}" x:Key="formOuterBorderStyle">
                            <Setter Property="Margin" Value="22,22,22,3" />
                            <Setter Property="Padding" Value="0" />
                            <Setter Property="BorderBrush" Value="{StaticResource BrushBorder}" />
                            <Setter Property="BorderThickness" Value="3" />
                            <Setter Property="Background" Value="{StaticResource BrushBackgroundDark}" />
                            <Setter Property="CornerRadius" Value="20,20,0,0" />
                        </Style>
                        <Style TargetType="{x:Type TextBlock}" x:Key="formTitleStyle">
                            <Setter Property="Foreground" Value="{StaticResource BrushWhiteSmoke}" />
                            <Setter Property="FontFamily" Value="Verdana" />
                            <Setter Property="FontSize" Value="16" />
                            <Setter Property="Padding" Value="11,7,7,7" />
                            <Setter Property="VerticalAlignment" Value="Stretch" />
                            <Setter Property="HorizontalAlignment" Value="Stretch" />
                        </Style>
                        <Style TargetType="{x:Type TextBlock}" x:Key="formBreadcrumbStyle">
                            <Setter Property="Foreground" Value="{StaticResource BrushWhiteSmoke}" />
                            <Setter Property="FontFamily" Value="Verdana" />
                            <Setter Property="FontSize" Value="11" />
                            <Setter Property="Padding" Value="7" />
                            <Setter Property="VerticalAlignment" Value="Stretch" />
                            <Setter Property="HorizontalAlignment" Value="Stretch" />
                        </Style>

                        <Style TargetType="{x:Type Rectangle}" x:Key="formBackgroundRectangleStyle">
                            <Setter Property="Fill" Value="{StaticResource BrushABCLight}" />
                        </Style>

                        <Style TargetType="{x:Type Border}" x:Key="formTitleBorderStyle">
                            <Setter Property="BorderBrush" Value="{StaticResource BrushBlack}" />
                            <Setter Property="BorderThickness" Value="0,0,0,2" />
                        </Style>

                    </ControlTemplate.Resources>
                    <AdornerDecorator d:DesignWidth="640" d:DesignHeight="480">
                        <Grid Width="Auto" Height="Auto">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="40"/>
                                <RowDefinition Height="40"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="40"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock HorizontalAlignment="Left" Margin="0" VerticalAlignment="Top" FontFamily="Arial" FontSize="18.667" Foreground="#FFE0E0E0" Text="{TemplateBinding Title}" TextWrapping="Wrap" Panel.ZIndex="2" Visibility="Collapsed"/>
                            <Path Fill="Black" Stretch="Fill" Stroke="{x:Null}" Margin="0" VerticalAlignment="Stretch" Height="Auto" Grid.Column="1" Grid.Row="0" Data="M0.5,0.5 L39.5,39.5 0.5,39.5 z"/>
                            <Border Background="Black" Margin="0" VerticalAlignment="Stretch" Height="Auto" Grid.Row="0" CornerRadius="10,0,0,0"/>
                            <!-- <Rectangle Fill="Black" Stroke="Black" Margin="0" VerticalAlignment="Stretch" Height="Auto" Grid.Row="0"/> -->
                            <Rectangle Stroke="{x:Null}" Margin="0" Height="Auto" Opacity="0.5" Grid.ColumnSpan="2" Grid.Row="3" Grid.RowSpan="1">
                                <Rectangle.Fill>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#FF222222" Offset="0"/>
                                        <GradientStop Color="#FFB3B3B3" Offset="1"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                            <Rectangle Fill="Black" Stroke="Black" Margin="0" Grid.ColumnSpan="2" Grid.Row="1"/>
                            <Rectangle Fill="{TemplateBinding Background}" Stroke="Black" Margin="0" Height="Auto" Panel.ZIndex="-7" Grid.ColumnSpan="2" Grid.Row="2" Grid.RowSpan="1"/>
                            <Border x:Name="bdr" Style="{StaticResource formOuterBorderStyle}" Margin="0" Grid.ColumnSpan="2" Grid.RowSpan="3" d:LayoutOverrides="Width, Height" d:IsHidden="True" Visibility="Collapsed"/>
                            <Grid Margin="3" Grid.ColumnSpan="2" Grid.RowSpan="3">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" MinHeight="77" />
                                    <RowDefinition MinHeight="400" />
                                </Grid.RowDefinitions>
                                <Border Style="{StaticResource formTitleBorderStyle}" BorderBrush="{x:Null}">
                                    <StackPanel Margin="0">
                                        <TextBlock Text="{Binding ViewModelFriendlyName}" Style="{StaticResource formTitleStyle}" />
                                        <TextBlock Margin="11,0,0,0" Text="{Binding BreadcrumbTrail}" Style="{StaticResource formBreadcrumbStyle}" />
                                    </StackPanel>
                                </Border>
                                <Rectangle Grid.Row="1" Style="{StaticResource formBackgroundRectangleStyle}" Visibility="Collapsed" />

                                <!--Put the form below here-->
                                <ContentPresenter x:Name="ContentPresenterX" Grid.Row="1" Margin="0" />    
                                <!--Put the form above here-->

                            </Grid>
                        </Grid>
                    </AdornerDecorator>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

I guess I really just want to know why I now have to tell the control to use the contentpresenter to present the content, when previously it know that is what I wanted, and also how I do it.

Any thoughts?

Cory

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

柒夜笙歌凉 2024-09-18 12:00:59

Content={TemplateBinding Property=Content} 添加到 ContentPresenter

关于此问题的 MSDN 论坛帖子建议将 ContentPropertyAttribute 设置器添加到控件代码隐藏中,但我无法使其工作。

科里

Added Content={TemplateBinding Property=Content} to ContentPresenter.

MSDN Forum post regarding this issue suggested adding the ContentPropertyAttribute setter to the controls codebehind, but I could not get that to work.

Cory

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文