使用模板以编程方式显示工具提示

Programmatically show a Tooltip using a Template

我想显示一个工具提示(有效)。但现在我想将模板应用到工具提示,这样它看起来比只是一个矩形更好。

在我的 window 的 xaml 文件中,我有以下资源:

<Window.Resources>
    <LinearGradientBrush x:Key="LightBrush" StartPoint="0,0" EndPoint="0,1">
    <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#FFF" Offset="0.0"/>
                <GradientStop Color="#EEE" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <SolidColorBrush x:Key="SolidBorderBrush" Color="#888" />

    <Style x:Key="{x:Type ToolTip}" TargetType="ToolTip">
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="HorizontalOffset" Value="0" />
        <Setter Property="VerticalOffset" Value="0" />
        <Setter Property="Background" Value="GhostWhite" />
        <Setter Property="Foreground" Value="Gray" />
        <Setter Property="FontSize" Value="12" />
        <Setter Property="FontFamily" Value="Segoe UI" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToolTip">
                    <Canvas Width="200" Height="100">
                        <Path x:Name="Container"
                  Canvas.Left="0"
                  Canvas.Top="0"
                  Margin="0"
                  Data="M 50,10 L60,0 L70,10 L100,10 L100,100 L0,100 L0,10 L50,10"
                  Fill="{TemplateBinding Background}"
                  Stroke="Black">
                            <Path.Effect>
                                <DropShadowEffect BlurRadius="10"
                                      Opacity="0.5"
                                      ShadowDepth="4" />
                            </Path.Effect>
                        </Path>
                        <TextBlock Canvas.Left="50"
                       Canvas.Top="28"
                       Width="100"
                       Height="65"
                       Text="{TemplateBinding Content}"
                       TextWrapping="Wrapwithoverflow" />
                    </Canvas>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

然后在 cs class 中,我按以下方式调用工具提示:

public static void ShowError(object sender, string text)
{
    var controlTemplate = new ControlTemplate(typeof(ToolTip));
    controlTemplate.VisualTree = new FrameworkElementFactory(typeof(ContentPresenter));
    ToolTip errormsg = new ToolTip { Content = text };
    errormsg.Template = controlTemplate;
    ToolTipService.SetShowDuration(errormsg, 3000);

    if (!errormsg.IsOpen)
    {
        errormsg.Opened += async delegate (object o, RoutedEventArgs args)
        {
            var s = o as ToolTip;
            // let the tooltip display for 2 second
            await Task.Delay(1000);
            s.IsOpen = false;

            ((FrameworkElement)sender).ToolTip = null;
        };
        errormsg.IsOpen = true;
     }
}

这使得工具提示在 3 秒后再次消失。 不幸的是,模板未应用于工具提示,仅显示文本。

谁能帮帮我?

谢谢!

你应该给工具提示样式一个key-name,例如TooltipStyleKey,并在你的代码后面也设置它。

public static void ShowError(object sender, string text)
{
    Style style = (Style)this.FindResource("TooltipStyleKey");
    ToolTip errormsg = new ToolTip { Content = text, Style = style };
    ToolTipService.SetShowDuration(errormsg, 3000);

    if (!errormsg.IsOpen)
    {
        errormsg.Opened += async delegate (object o, RoutedEventArgs args)
        {
            var s = o as ToolTip;
            // let the tooltip display for 2 second
            await Task.Delay(1000);
            s.IsOpen = false;

            ((FrameworkElement)sender).ToolTip = null;
        };
        errormsg.IsOpen = true;
     }
}

但是,最好使用 XAML 来显示工具提示。您可以在视图模型中为错误消息设置 属性,并将其绑定到工具提示的内容。