我有一个WPF的语音气泡工具提示,这是工作正常。
<Style x:Key="{x:Type ToolTip}" TargetType="ToolTip">
<Setter Property="OverridesDefaultStyle" Value="true" />
<Setter Property="HorizontalOffset" Value="1" />
<Setter Property="VerticalOffset" Value="1" />
<Setter Property="Background" Value="White" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="FontSize" Value="12" />
<Setter Property="FontFamily" Value="Segoe UI" />
<Setter Property="DataContext" Value="{Binding Path=PlacementTarget.DataContext, RelativeSource={x:Static RelativeSource.Self}}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToolTip">
<Canvas Width="225" Height="131">
<Path x:Name="Container"
Canvas.Left="0"
Canvas.Top="0"
Margin="0"
Data="M8,7.41 L15.415,0 L22.83,7.41 L224,7.41 L224,130 L0,130 L0,7.41 L8,7.41"
Fill="{TemplateBinding Background}"
Stroke="Gray">
<Path.Effect>
<DropShadowEffect BlurRadius="10"
Opacity="0.5"
ShadowDepth="4" />
</Path.Effect>
</Path>
<TextBlock Canvas.Left="10"
Canvas.Top="10"
Width="100"
Height="65"
Text="{TemplateBinding Content}"
TextWrapping="WrapWithOverflow" />
</Canvas>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
上述方法的问题是,无论在何种情况下,语音气泡工具提示(路径)的箭头/指针总是放置在相同的位置,我希望它能适应这种情况,并使用以下方式之一(上述样式实现了放置在左上角的箭头,下面截图中的第一个工具提示):
我怎么能做到这一点?这可能吗?
2条答案
按热度按时间k5ifujac1#
下面是此任务的完整代码:
这是你如何使用它:
ymzxtsji2#
这是一个创建装饰器的典型例子。我曾经在一个文本周围做了一个可定制的ArrowBorder。你需要从装饰器类继承。
然后你需要一些DependencyProperties,这样它就很容易定制。在我的例子中,这是
ArrowTipToArrowTriangleBaseDistance
属性,它意味着箭头应该有多“尖”。在你的例子中,气泡文本箭头应该在哪里。然后,您需要覆盖
ArrangeOverride
、MeasureOverride
和OnRender
方法。前两个来自Decorator类,第三个来自UIElement类。这里有一个很好的link来理解前两个。在
OnRender
中,你有一个DrawingContext来使用DependenyProperties绘制你想要的形状。完成这些之后,您可以简单地在xaml中使用装饰器,如下所示:
第一次