1. 程式人生 > >WPF 文字換行TextWrapping 顯示不全用省略號TextTrimming 顯示不全彈提示內容ToolTip

WPF 文字換行TextWrapping 顯示不全用省略號TextTrimming 顯示不全彈提示內容ToolTip

aml aaa esp tails ipc tool except idt else

原文:WPF 文字換行TextWrapping 顯示不全用省略號TextTrimming 顯示不全彈提示內容ToolTip

【TextBlock】

換行? ? TextWrapping="Wrap"

內容顯示不全時顯示省略號,如 “AAA...”? ??TextTrimming="CharacterEllipsis" //以單詞邊界做截斷

鼠標提示? ?<ToolTip>

?

例:??

TextBlock不允許換行,超出後顯示省略號截斷,超出的情況鼠標移上去會彈出提示內容。

?①? .xaml

<!--xaml 內容不允許換行,顯示不下用省略號-->
<TextBlock TextTrimming="CharacterEllipsis" Width="150" TextWrapping="NoWrap" Text="AAAA">
    <TextBlock.ToolTip>
        <ToolTip Style="{DynamicResource TooltipStyle}" Content="BBB"/>
    </TextBlock.ToolTip>
</TextBlock>

?② ToolTip樣式定義

屬性Visibility綁定轉換器,僅當內容顯示不全時彈出

<Style x:Key="TooltipStyle" TargetType="{x:Type ToolTip}">
                <Setter Property="MaxWidth" Value="228"/>
                <Setter Property="BorderThickness" Value="0"/>
                <Setter Property="Background" Value="#FF565656"/>
                <Setter Property="FontFamily" Value="{DynamicResource BaseFontFamily}"/>
                <Setter Property="FontSize" Value="14"/>
                <Setter Property="Foreground" Value="#FFFFFFFF"/>
                <!--內容顯示不全時彈出-->
                <Setter Property="Visibility" Value="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget, Converter={StaticResource TrimToolTipConverter}}"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ToolTip}">
                            <Border CornerRadius="4" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                                <TextBlock Padding="8,4" Margin="0,-1,0,0" TextWrapping="Wrap" FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}"
                                           Foreground="{TemplateBinding Foreground}" Text="{TemplateBinding Content}">
                                </TextBlock>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

?

?③ Converter轉換器

判斷TextBlock是否啟用Trim屬性(內容顯示不下),啟用了則ToolTip可視

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;

namespace ui.DataConverter
{
        /// <summary>
        /// 文字顯示不下通過ToolTip提示顯示
        /// </summary>
        public class TrimmedTextBlockVisibilityConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (value == null)
                {
                    return Visibility.Collapsed;
                }

                TextBlock textBlock = (TextBlock)value;
                bool isTrim = IsTextTrimmed(textBlock);

                if (isTrim)
                {
                    return Visibility.Visible;
                }
                else
                {
                    return Visibility.Collapsed;
                }
            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }

            /// <summary>
            /// 判斷當前顯示的內容是否顯示不全被截斷
            /// </summary>
            /// <param name="textBlock"></param>
            /// <returns></returns>
            private bool IsTextTrimmed(TextBlock textBlock)
            {
                Typeface typeface = new Typeface(
                    textBlock.FontFamily,
                    textBlock.FontStyle,
                    textBlock.FontWeight,
                    textBlock.FontStretch);

                FormattedText formattedText = new FormattedText(
                    textBlock.Text,
                    System.Threading.Thread.CurrentThread.CurrentCulture,
                    textBlock.FlowDirection,
                    typeface,
                    textBlock.FontSize,
                    textBlock.Foreground); 
                bool isTrimmed = formattedText.Width > textBlock.Width;
                return isTrimmed;
            }
        }
}

?

WPF 文字換行TextWrapping 顯示不全用省略號TextTrimming 顯示不全彈提示內容ToolTip