wpfvb.netcontentpresenter

How can I set ContentPropertyAttribute to a Content Presenter?


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


Solution

  • 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