WPF - 设置ToolTip的最大宽度

25

我想将 ToolTip 的最大宽度属性设置为能够正确显示长文本。此外,我需要文字换行。我使用了以下样式:

<Style TargetType="ToolTip">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding}"  MaxWidth="400" TextWrapping='Wrap' />
                    </StackPanel>
                </DataTemplate>
            </Setter.Value>
        </Setter>
</Style>

这个工具提示样式对我的目的来说还可以。然而,对于一些拥有自己工具提示样式的控件来说,它并不起作用。例如,以下按钮的工具提示无法显示。

<Button>
    <Button.ToolTip>
        <StackPanel>
            <TextBlock Style="{StaticResource firstText}" Text="aaaaaaaaaaaaa"/>
            <TextBlock Style="{StaticResource secondText}" Text="bbbbbbbbbbbbb"/>    
            <TextBlock Bacground="Red" Text="ccccccccccccc"/>    
        </StackPanel>
    </Button.ToolTip>
</Button>

我想为所有工具提示设置文本换行的最大宽度属性。我该怎么做?


“for some controls which has own tooltip style” 是什么意思? - Ramin
我的意思是特定的工具提示。例如示例中的按钮,由三个文本块组成。但如果我像这样使用:<Button ToolTip="你好世界.."/>,我的样式就成功了。因此,具有不同结构的不同工具提示无法使用我的样式。 - iremce
我已经提高了它,但我认为你应该更详细地解释你的目标。总有更好的方法来做事情 :-)。 - Ramin
4个回答

33

我避免使用模板,因为很多东西必须实现。所以有更优雅的方式来做。

<Style TargetType="ToolTip">
    <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>

2
这实际上是一个非常好的、干净的解决方案,具有很多重用性。我认为在TargetType中使用x:Type也更加严格和清晰。 - Tore Aurstad
仅仅因为我使用了很多自定义工具提示,我认为你应该将最大宽度属性移动到实际的文本块样式上。这意味着所有默认的工具提示都有一个最大宽度,但是所有自定义工具提示都定义了自己的参数。 - James McDuffie

30

我知道这是个老问题,但似乎还没有人提出最显而易见和最简单的解决方案。因此,我想在这里补充一下:

<Button>
    <Button.ToolTip>
        <ToolTip MaxWidth="400">
            <TextBlock Text="{Binding Binding}" TextWrapping="Wrap" />
        </ToolTip>
    </Button.ToolTip>
</Button>

2
最简单的解决方案! - Yarl

11

以下的工具提示样式对我很有用:

<Style TargetType="ToolTip" x:Key="InternalToolTipStyle">
    <Setter Property="MaxWidth" Value="{Binding Path=(lib:ToolTipProperties.MaxWidth)}" />
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <ContentPresenter Content="{TemplateBinding Content}"  >
                    <ContentPresenter.Resources>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="TextWrapping" Value="Wrap" />
                        </Style>
                    </ContentPresenter.Resources>
                </ContentPresenter>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

使用此样式,以下按钮的工具提示将正确显示:

<Button>
<Button.ToolTip>
    <StackPanel>
        <TextBlock Style="{StaticResource firstText}" Text="aaaaaaaaaaaaa"/>
        <TextBlock Style="{StaticResource secondText}" Text="bbbbbbbbbbbbb"/>    
        <TextBlock Bacground="Red" Text="ccccccccccccc"/>    
    </StackPanel>
</Button.ToolTip>

:空段落标签。

0
使用这个:
<Window.Resources>
 <Style TargetType="ToolTip" x:Key="TT">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding}"  MaxWidth="400" TextWrapping='Wrap' />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
 </Style>
</Window.Resources>

<Button>
    <Button.ToolTip>
        <ToolTip Style="{StaticResource TT}">
  bbbbbbbbbbbbbbbbbbbdddddddddddddddddbbbmmmmmmhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
        </ToolTip>
    </Button.ToolTip>
</Button>

编辑:

<Button>
    <Button.ToolTip>
        <RichTextBox>
           <FlowDocument>
              <Paragraph>
                This is flow content and you can <Bold>edit me!</Bold>
              </Paragraph>
           </FlowDocument>
</RichTextBox>
    </Button.ToolTip>
</Button>

请参阅:RichTextBox 概述


我不应该更改控件的内容。按钮应该看起来像我的问题(带有包含两个文本块的StackPanel)。 - iremce
@iremce 我的示例中的按钮与你的相同。你将其工具提示设置为StackPanel,但我将其更改为使用你的样式的工具提示。我认为你应该解释一下你的目标。为什么不使用工具提示样式?你想让工具提示显示两个段落吗? - Ramin
是的,按钮或其他控件的工具提示可以包含一个以上的段落。我不应该改变控件的工具提示结构。 - iremce
@iremce 你可以使用RichTextBox控件。它更加灵活。请看我的编辑。 - Ramin
我没有更改控件结构的权限,因此无法使用RichTextBox。另外,我编辑了我的按钮示例。 - iremce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接