C# ContentControl包装问题
我正在尝试创建自定义工具提示控件。此控件从ToolTip类继承。我的自定义工具提示将有一个标题和一个内容区域。内容可以是普通文本或任何其他内容(图像、richtextbox等)。以下是用于自定义工具提示控件的模板样式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
<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}
完全一样。它有一些限制(如noMode=TwoWay
或StringFormat),但最大的优点是它在编译时经过验证-因此,如果您在属性拼写上出错,那么在使用TemplateBinding
时,您将得到生成错误。使用常规绑定构建将成功,但随后您将花费很长的时间来找出模板/控件看起来错误的原因。R#即使在常规绑定中也有帮助,但是模板绑定
更安全。默认情况下,堆栈面板
具有方向=水平
。在这种情况下,StackPanel
会在X轴上“阻塞”其子级,但不会在Y轴上。因此,TextBlock
将“感觉”边界并进行包装。