TextBlock 重写,当文本过长时,自动截断文本并出现Tooltip
如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Controls;
- using System.Windows.Media;
- using System.Windows;
- using System.Globalization;
- namespace XXXX
- {
- public class TooltipTextBlock : TextBlock
- {
- static TooltipTextBlock()
- {
- OneLineHeightProperty =
- DependencyProperty.Register(
- "OneLineHeight",
- typeof(double),
- typeof(TooltipTextBlock),
- new FrameworkPropertyMetadata((double))
- );
- }
- protected override void OnToolTipOpening(ToolTipEventArgs e)
- {
- if (TextTrimming != TextTrimming.None)
- {
- e.Handled = !IsTextTrimmed();
- }
- }
- private bool IsTextTrimmed()
- {
- var typeface = new Typeface(FontFamily, FontStyle, FontWeight, FontStretch);
- var formattedText = new FormattedText(Text, CultureInfo.CurrentCulture, FlowDirection, typeface, FontSize, Foreground);
- double lineHeight = OneLineHeight;//formattedText.Height;
- double totalWidth = formattedText.Width;
- int lines = (int)Math.Ceiling(totalWidth / ActualWidth);
- return (lines * lineHeight > MaxHeight);
- }
- public double OneLineHeight
- {
- get { return (double)GetValue(OneLineHeightProperty); }
- set { SetValue(OneLineHeightProperty, value); }
- }
- public static readonly DependencyProperty OneLineHeightProperty;
- }
- }
使用:
- TooltipTextBlock tb = new TooltipTextBlock();
- tb.Margin = new Thickness(, , , );
- tb.Width = ;
- tb.MaxHeight = ;
- tb.TextAlignment = TextAlignment.Center;
- tb.Style = (Style)Utils.CommonFunctions.LoadResource("CardBody_TextStyle");
- tb.TextTrimming = TextTrimming.WordEllipsis;
- tb.TextWrapping = TextWrapping.Wrap;
- tb.OneLineHeight = ;
- ToolTip tt = new ToolTip() { Content = des, };
- tb.ToolTip = tt;
或:
- xmlns:local="clr-namespace:Test"
- <local:TooltipTextBlock Text="This is some text lafsdk jflklakjsd " TextWrapping="Wrap"
- TextTrimming="WordEllipsis"
- ToolTip="{Binding Text,RelativeSource={RelativeSource Self}}"
- MaxWidth="" Height="" MaxHeight="" Background="Gray" OneLineHeight=""/>
新方法:
- <TextBlock Text="Demo" ui:TextBlockAutoToolTip.Enabled="True"/>
- var textBlock = new TextBlock { Text = "Demo" };
- TextBlockAutoToolTip.SetEnabled(textBlock, true);
- using System;
- using System.Globalization;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Media;
- namespace Unclassified.UI
- {
- /// <summary>
- /// Shows a ToolTip over a TextBlock when its text is trimmed.
- /// </summary>
- public class TextBlockAutoToolTip
- {
- /// <summary>
- /// The Enabled attached property.
- /// </summary>
- public static readonly DependencyProperty EnabledProperty = DependencyProperty.RegisterAttached(
- "Enabled",
- typeof(bool),
- typeof(TextBlockAutoToolTip),
- new FrameworkPropertyMetadata(new PropertyChangedCallback(OnAutoToolTipEnabledChanged)));
- /// <summary>
- /// Sets the Enabled attached property on a TextBlock control.
- /// </summary>
- /// <param name="dependencyObject">The TextBlock control.</param>
- /// <param name="enabled">The value.</param>
- public static void SetEnabled(DependencyObject dependencyObject, bool enabled)
- {
- dependencyObject.SetValue(EnabledProperty, enabled);
- }
- private static readonly TrimmedTextBlockVisibilityConverter ttbvc = new TrimmedTextBlockVisibilityConverter();
- private static void OnAutoToolTipEnabledChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
- {
- TextBlock textBlock = dependencyObject as TextBlock;
- if (textBlock != null)
- {
- bool enabled = (bool)args.NewValue;
- if (enabled)
- {
- var toolTip = new ToolTip
- {
- Placement = System.Windows.Controls.Primitives.PlacementMode.Relative,
- VerticalOffset = -,
- HorizontalOffset = -,
- Padding = new Thickness(, , , ),
- Background = Brushes.White
- };
- toolTip.SetBinding(UIElement.VisibilityProperty, new System.Windows.Data.Binding
- {
- RelativeSource = new System.Windows.Data.RelativeSource(System.Windows.Data.RelativeSourceMode.Self),
- Path = new PropertyPath("PlacementTarget"),
- Converter = ttbvc
- });
- toolTip.SetBinding(ContentControl.ContentProperty, new System.Windows.Data.Binding
- {
- RelativeSource = new System.Windows.Data.RelativeSource(System.Windows.Data.RelativeSourceMode.Self),
- Path = new PropertyPath("PlacementTarget.Text")
- });
- toolTip.SetBinding(Control.ForegroundProperty, new System.Windows.Data.Binding
- {
- RelativeSource = new System.Windows.Data.RelativeSource(System.Windows.Data.RelativeSourceMode.Self),
- Path = new PropertyPath("PlacementTarget.Foreground")
- });
- textBlock.ToolTip = toolTip;
- textBlock.TextTrimming = TextTrimming.CharacterEllipsis;
- }
- }
- }
- private class TrimmedTextBlockVisibilityConverter : IValueConverter
- {
- public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
- {
- var textBlock = value as TextBlock;
- if (textBlock == null)
- return Visibility.Collapsed;
- Typeface typeface = new Typeface(
- textBlock.FontFamily,
- textBlock.FontStyle,
- textBlock.FontWeight,
- textBlock.FontStretch);
- // FormattedText is used to measure the whole width of the text held up by TextBlock container
- FormattedText formattedText = new FormattedText(
- textBlock.Text,
- System.Threading.Thread.CurrentThread.CurrentCulture,
- textBlock.FlowDirection,
- typeface,
- textBlock.FontSize,
- textBlock.Foreground);
- formattedText.MaxTextWidth = textBlock.ActualWidth;
- // When the maximum text width of the FormattedText instance is set to the actual
- // width of the textBlock, if the textBlock is being trimmed to fit then the formatted
- // text will report a larger height than the textBlock. Should work whether the
- // textBlock is single or multi-line.
- // The width check detects if any single line is too long to fit within the text area,
- // this can only happen if there is a long span of text with no spaces.
- bool isTrimmed = formattedText.Height > textBlock.ActualHeight ||
- formattedText.MinWidth > formattedText.MaxTextWidth;
- return isTrimmed ? Visibility.Visible : Visibility.Collapsed;
- }
- public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
- {
- throw new NotImplementedException();
- }
- }
- }
- }
TextBlock 重写,当文本过长时,自动截断文本并出现Tooltip的更多相关文章
- HTML中文本过长时自动隐藏末尾部分或中间等任意部分
一. 一般情况下,HTML字符串过长时都会将超过的部分隐藏点,方法如下: 设置CSS: .ellipsis-type{ max-width: 50px; ...
- css实现文本过长时自动添加省略号
1. 效果 2. Html <div id="main_app_content" class="container"> <div class= ...
- WPF TextBox/TextBlock 文本超出显示时,文本靠右显示
文本框显示 文本框正常显示: 文本框超出区域显示: 实现方案 判断文本框是否超出区域 请见<TextBlock IsTextTrimmed 判断文本是否超出> 设置文本布局显示 1. Fl ...
- 背水一战 Windows 10 (104) - 通知(Toast): 纯文本 toast, 短时 toast, 长时 toast, 图文 toast
[源码下载] 背水一战 Windows 10 (104) - 通知(Toast): 纯文本 toast, 短时 toast, 长时 toast, 图文 toast 作者:webabcd 介绍背水一战 ...
- (转)完美解决 Android WebView 文本框获取焦点后自动放大有关问题
完美解决 Android WebView 文本框获取焦点后自动放大问题 前几天在写一个项目时,要求在项目中嵌入一个WebView 本来很快就完成了,测试也没有问题.但发给新加坡时,他们测试都会出现文本 ...
- python基础语法13 内置模块 subprocess,re模块,logging日志记录模块,防止导入模块时自动执行测试功能,包的理论
subprocess模块: - 可以通过python代码给操作系统终端发送命令, 并且可以返回结果. sub: 子 process: 进程 import subprocess while Tru ...
- 关于angularJS绑定数据时自动转义html标签
关于angularJS绑定数据时自动转义html标签 angularJS在进行数据绑定时默认是会以文本的形式输出,也就是对你数据中的html标签不进行转义照单全收,这样提高了安全性,防止了html标签 ...
- android脚步---自动完成文本框
自动完成文本框AutoCompleteTextView,当用户输入一定字符时,自动完成文本框会显示一个下拉菜单,供用户选择,设置一个Adapter,该Adapter中封装了AutoCompleteTe ...
- Android 文字过长TextView如何自动截断并显示成省略号
当用TextView来显示标题的时候,如果标题内容过长的话,我们不希望其换行显示,这时候我们需要其自动截断,超过的部分显示成省略号. 如下图所示,标题过长,自动换行了,显示不是很好看. 这时候我们需要 ...
随机推荐
- 微信小程序一些总结
1.体验版和线上是啥区别,啥关系 在微信开发者工具里提交代码后进入体验版,在微信后台里点击版本管理,就可以看到线上版本,和开发体验版,描述里有提交备注. 在体验版里发布审核之后会进入到线上.他们两个可 ...
- WinForm—串口通讯
ialPort(串行端口资源) 常用属性: BaudRate 此串行端口上要使用的波特率 DataBits 每发送/接收一个字节的数据位数目 DtrEnable 在通讯过程中是否启用数据终端就绪(St ...
- Liunx-history命令
1. 查看历史命令执行记录 2. 查看命令cd 的历史执行记录 3. 执行历史记录中,序号为1的命令
- http2.0之头部压缩
什么是头部压缩?为什么要头部压缩? 我们知道,http请求和响应都是由[状态行.请求/响应头部.消息主题]三部分组成的. 一般而言,消息主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件 ...
- rabbitmq实现一台服务器同时给所有的consumer发送消息(tp框架)(第四篇)
之前的学习了把消息直接publish到queue里面,然后consume掉, 真实的情况,我们会把消息先发送到exchange里面,由它来处理,是发给某一个队列,还是发给某些队列,还是丢弃掉? exc ...
- elasticsearch(二) 之 elasticsearch安装
目录 elasticsearch 安装与配置 安装java 安装elastcsearch 二进制安装(tar包) 在进入生产之前我们必须要考虑到以下设置 增大打开文件句柄数量 禁用虚拟内存 合适配置的 ...
- Linux-(tar,gzip,df,du)
tar命令 首先要弄清两个概念:打包和压缩.打包是指将一大堆文件或目录变成一个总的文件:压缩则是将一个大的文件通过一些压缩算法变成一个小文件. 为什么要区分这两个概念呢?这源于Linux中很多压缩程序 ...
- HihoCoder - 1040 矩形判断
矩形判断 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. Input 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4 ...
- SpringMvc注解开发
1.四大注解的定义 (1)Controller注解:该注解使用在一个类上面,参数为value,值为访问该controller的名称,默认为空,如果为空 则值为该controller类名的首字母小写的值 ...
- 使用vue2+Axios+Router 之后的总结以及遇到的一些坑
构建 vue有自己的脚手架构建工具vue-cli,使用起来非常方便,使用webpack来集成各种开发便捷工具,比如: 代码热更新,修改代码之后网页无刷新改变,对前端开发来说非常的方便 PostCss, ...