如何动态创建带有包装文本的工具提示

时间:2018-09-05 18:37:31

标签: c# wpf

我动态创建了一个Textblock,需要显示一个包装好的工具提示。

我在App.xaml中有一个资源

<Style TargetType="ToolTip" x:Key="ToolTipWrap">
   <Style.Resources>
      <Style TargetType="ContentPresenter">
        <Style.Resources>
            <Style TargetType="TextBlock">
             <Setter Property="TextWrapping" Value="Wrap" />
        </Style>
       </Style.Resources>
     </Style>
  </Style.Resources>
<Setter Property="MaxWidth" Value="500" />
</Style>

如何将样式分配给工具提示?

TextBlock tb = New TextBlock();
tb.ToolTip = some_long_text;

没有tb.ToolTip.Style属性和
tb.Style =(Style)FindResource(“ ToolTipWrap”)给出有关目标类型错误的错误

2 个答案:

答案 0 :(得分:1)

自定义控件怎么样?

enter image description here

print(intent) if let shortcut = INShortcut(intent: intent) { let vc = INUIAddVoiceShortcutViewController(shortcut: shortcut) vc.delegate = self present(vc, animated: true) } else { print("INShortcut failed") }

TextblockWithTooltip.xaml

<UserControl x:Name="root" x:Class="WpfApp4.TextblockWithTooltip" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <UserControl.Resources> </UserControl.Resources> <Grid> <Grid.Resources> <Style TargetType="ToolTip" x:Key="ToolTipWrap"> <Style.Resources> <Style TargetType="ContentPresenter"> <Style.Resources> <Style TargetType="TextBlock"> <Setter Property="TextWrapping" Value="Wrap" /> </Style> </Style.Resources> </Style> </Style.Resources> <Setter Property="MaxWidth" Value="100" /> </Style> </Grid.Resources> <TextBlock x:Name="TooltippedTextblock" Text="{Binding DisplayText, ElementName=root}" ToolTipOpening="TooltippedTextblock_OnToolTipOpening"> <TextBlock.ToolTip> <ToolTip x:Name="MainToolTip" Style="{StaticResource ToolTipWrap}" /> </TextBlock.ToolTip> </TextBlock> </Grid> </UserControl>

TextblockWtihTooltip.xaml.cs

要使用它,请在我的MainView中:

using System.Windows;
using System.Windows.Controls;

namespace WpfApp4
{
    public partial class TextblockWithTooltip
    {
        public TextblockWithTooltip()
        {
            InitializeComponent();
        }

        public static readonly DependencyProperty DisplayTextPropery =
            DependencyProperty.Register(
                nameof(DisplayText),
                typeof(string),
                typeof(TextblockWithTooltip),
                new PropertyMetadata(string.Empty));

        public static readonly DependencyProperty TooltipTextPropery =
            DependencyProperty.Register(
                nameof(TooltipText),
                typeof(string),
                typeof(TextblockWithTooltip),
                new PropertyMetadata(string.Empty));

        public string DisplayText
        {
            get => (string)GetValue(DisplayTextPropery);
            set => SetValue(DisplayTextPropery, value);
        }

        public string TooltipText
        {
            get => (string)GetValue(TooltipTextPropery);
            set => SetValue(TooltipTextPropery, value);
        }

        private void TooltippedTextblock_OnToolTipOpening(object sender, ToolTipEventArgs e)
        {
            MainToolTip.Content = TooltipText;
        }
    }
}

MainView的代码隐藏(动态添加控件):

<Window x:Class="WpfApp4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid x:Name="MainGrid">
    </Grid>
</Window>

答案 1 :(得分:1)

这是我的解决办法。

full join

将最大宽度修改为100以进行测试(500宽度太长,为了快速测试将其设为100)...

这是工具提示的应用样式。 创建了'Tooltip'的新对象,并为其分配了'ToolTipWrap'样式。 Textblock工具提示文本已分配给“工具提示内容”

 <Style TargetType="ToolTip" x:Key="ToolTipWrap">
        <Style.Resources>
            <Style TargetType="ContentPresenter">
                <Style.Resources>
                    <Style TargetType="TextBlock">
                        <Setter Property="TextWrapping" Value="Wrap"  />
                    </Style>
                </Style.Resources>
            </Style>
        </Style.Resources>
        <Setter Property="MaxWidth" Value="100" />
    </Style>