我們的應用程式中有許多 TextBlock,其中許多必須有 ToolTips。
通常,工具提示應顯示與TextBlock.Text屬性相同。此外,如果 TextBlock.Text =或
,則不應顯示工具提示。""null
所以我們在很多地方都有這個解決方案:
<TextBlock Text="{Binding SomeTextProperty}">
<TextBlock.ToolTip>
<ToolTip Visibility="{Binding SomeTextProperty}, Converter={StaticResource StringToVisibilityConverter}">
<TextBlock Text="{Binding SomeTextProperty}" />
</TextBlock.ToolTip>
</TextBlock>
注意:
- 我必須
SomeTextProperty在每個需要具有此功能的 ToolLTip 的 TextBlock 上指定三次。
這似乎很多余! - 這
ToolTip.Content是一個 TextBlock 本身。
這是因為我需要在 TextBlock 上有一個樣式。
我省略了這種風格,以使這篇文章盡可能簡單。
因此,我嘗試為 TextBlocks 發明一種樣式,用于Bindings獲取RelativeSourceToolTip 的TextBlock.Text屬性。我想出了這個解決方案:
MainWindow(只是復制粘貼或多或少)
<Window x:Class="Main.Views.ToolTips"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Main.Views"
xmlns:converters="clr-namespace:Main.Converters"
mc:Ignorable="d"
Title="ToolTips" Height="450" Width="800">
<Window.Resources>
<Style TargetType="TextBlock" x:Key="TextBlockWithToolTipStyle">
<Style.Resources>
<converters:StringToVisibilityConverter x:Key="StringToVisibilityConverter" />
</Style.Resources>
<Setter Property="ToolTip">
<Setter.Value>
<ToolTip Visibility="{Binding Text, RelativeSource={RelativeSource AncestorType={x:Type TextBlock}}, Converter={StaticResource StringToVisibilityConverter}}">
<ToolTip.Content>
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TextBlock}}}" />
</ToolTip.Content>
</ToolTip>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="This should display a tooltip" />
<TextBlock Text="asdf"
Background="Gray"
Style="{StaticResource TextBlockWithToolTipStyle}" />
<Separator Height="50" Visibility="Hidden" />
<TextBlock Text="This should not display a tooltip" />
<TextBlock Text=""
Background="LightGray"
Style="{StaticResource TextBlockWithToolTipStyle}" />
</StackPanel>
</Window>
StringToVisibilityConverter
public class StringToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var input = value is null ? string.Empty : value.ToString();
return string.IsNullOrWhiteSpace(input) ? Visibility.Collapsed : Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
這當然行不通!
我在 StringToVisibilityConverter 中放置了一個斷點,當我將兩個 TextBlocks 都懸停在視窗中時,該斷點不會被命中。
在 VS 的XAML Binding Failures視圖中,我看到兩個關于ToolTip.Visibilityand的系結錯誤TextBlock.Text:
- ToolTip.Visibility:找不到源:RelativeSource FindAncestor,AncestorType='System.Windows.Controls.TextBlock',AncestorLevel='1'
- TextBlock.Text:找不到源:RelativeSource FindAncestor,AncestorType='System.Windows.Controls.TextBlock',AncestorLevel='1'
這有可能解決嗎?
如果是這樣,怎么做?
/BR,斯蒂夫
uj5u.com熱心網友回復:
ToolTip不是可視化樹的一部分。這就是為什么你Binding.RelativeSource沒有解決。
要參考由 裝飾的元素,ToolTip您必須參考該ToolTip.PlacementTarget屬性:
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=ToolTip}, Path=PlacementTarget.Text}" />
此外,您不應嘗試切換ToolTip.Visibility. 它行不通。而是使用 aTrigger來設定ToolTip.
正確的解決方案如下:
<Style TargetType="TextBlock"
x:Key="TextBlockWithToolTipStyle">
<Style.Resources>
<ToolTip x:Key="ToolTip">
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=ToolTip}, Path=PlacementTarget.Text}" />
</ToolTip>
</Style.Resources>
<Setter Property="ToolTip"
Value="{StaticResource ToolTip}" />
<Style.Triggers>
<Trigger Property="Text" Value="">
<Setter Property="ToolTip" Value="{x:Null}" />
</Trigger>
</Style.Triggers>
</Style>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/440636.html
