C# ContentControl包装问题

C# ContentControl包装问题,c#,.net,wpf,xaml,wpf-controls,C#,.net,Wpf,Xaml,Wpf Controls,我正在尝试创建自定义工具提示控件。此控件从ToolTip类继承。我的自定义工具提示将有一个标题和一个内容区域。内容可以是普通文本或任何其他内容(图像、richtextbox等)。以下是用于自定义工具提示控件的模板样式 <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type customControls:Flyout

我正在尝试创建自定义工具提示控件。此控件从ToolTip类继承。我的自定义工具提示将有一个标题和一个内容区域。内容可以是普通文本或任何其他内容(图像、richtextbox等)。以下是用于自定义工具提示控件的模板样式

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type customControls:FlyoutHelp}">
                <Border BorderThickness="0" Margin="15" Width="300">
                    <Border.Effect>
                        <DropShadowEffect Opacity="0.7"  />
                    </Border.Effect>
                    <StackPanel  TextBlock.FontFamily="Trebuchet MS" TextBlock.FontSize='12'>
                        <TextBlock Background="{StaticResource DellBlue}" Height="23" Foreground="#FFFFFF" Padding="0,4,0,0"  TextAlignment="Center" Text="{Binding HeaderText, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
                        <Border Background="{StaticResource DellLightGrey}" TextBlock.Foreground="{StaticResource DarkestGrey}" Padding="8">
                            <ContentControl   Content="{Binding HelpContent, RelativeSource={RelativeSource Mode=TemplatedParent}}"   />
                        </Border>
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>


现在您可以在我的模板中看到,我正在使用ContentControl显示工具提示的内容。问题是当我的帮助内容只是纯字符串时,它不会包装该文本。我不能用TextBlock替换ContentControl,因为HelpContent也可以是其他类型(图像、richtextbox等)。谁能告诉我解决这个问题的最好方法是什么?我将非常感激。

ContentControl
标记替换为:

<ContentPresenter Content="{TemplateBinding HelpContent}">
    <ContentPresenter.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="TextWrapping" Value="Wrap"/>
        </Style>
    </ContentPresenter.Resources>
</ContentPresenter>


[注意:您可以将其保留为
ContentControl
,但是
ContentPresenter
更轻,并且遵循惯例]

StackPanel
更改为
Grid
,因为它不知道包裹的宽度

<Grid TextBlock.FontFamily="Trebuchet MS" TextBlock.FontSize='12'>
  <Grid.RowDefinitions>
     <RowDefinitions/>
     <RowDefinitions/>
  <Grid.RowDefinitions/>
  <TextBlock Grid.Row="0" Background="{StaticResource DellBlue}" Height="23" Foreground="#FFFFFF" Padding="0,4,0,0"  TextAlignment="Center" Text="{Binding HeaderText, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
  <Border Grid.Row="1" Background="{StaticResource DellLightGrey}" TextBlock.Foreground="{StaticResource DarkestGrey}" Padding="8">
    <ContentControl   Content="{Binding HelpContent, RelativeSource={RelativeSource Mode=TemplatedParent}}"   />
  </Border>
</Grid>


与绑定相比,此处使用TemplateBinding有什么优势?我认为TemplateBinding只是继承控件的默认属性。从赋值的角度来看,
TemplateBinding
与使用规则绑定
RelativeSource={RelativeSourceTemplatedParent}
完全一样。它有一些限制(如no
Mode=TwoWay
或StringFormat),但最大的优点是它在编译时经过验证-因此,如果您在属性拼写上出错,那么在使用
TemplateBinding
时,您将得到生成错误。使用常规绑定构建将成功,但随后您将花费很长的时间来找出模板/控件看起来错误的原因。R#即使在常规绑定中也有帮助,但是
模板绑定
更安全。默认情况下,
堆栈面板
具有
方向=水平
。在这种情况下,
StackPanel
会在X轴上“阻塞”其子级,但不会在Y轴上。因此,
TextBlock
将“感觉”边界并进行包装。