zoukankan      html  css  js  c++  java
  • wpf textblock超出显示范围后显示tooltip

    public static class TextTrmmingShowToolTip
        {
            public static readonly DependencyProperty IsToolTipProperty = DependencyProperty.RegisterAttached(
                "IsToolTip", typeof(bool), typeof(TextTrmmingShowToolTip),
                new PropertyMetadata(default(bool), TextPropertyChangedCallback));
    
            public static void SetIsToolTip(DependencyObject element, bool value)
            {
                element.SetValue(IsToolTipProperty, value);
            }
    
            public static bool GetIsToolTip(DependencyObject element)
            {
                return (bool) element.GetValue(IsToolTipProperty);
            }
    
            private static void TextPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                var tb = d as TextBlock;
                if (tb == null) return;
                tb.SizeChanged -= TbOnSizeChanged;
                if (!(bool) e.NewValue) return;
                tb.SizeChanged += TbOnSizeChanged;
            }
    
            private static void TbOnSizeChanged(object sender, SizeChangedEventArgs e)
            {
                var tb = sender as TextBlock;
                if (tb == null) return;
                SetToolTip(tb);
            }
    
            private static void SetToolTip(TextBlock tb)
            {
                if (string.IsNullOrEmpty(tb.Text))
                {
                    tb.ToolTip = null;
                    return;
                }
    
                var isTrim = IsTextTrimmed(tb);
                tb.ToolTip = isTrim ? tb.Text : null;
            }
    
            private static 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.ActualWidth;
                return isTrimmed;
            }
        }
    View Code

    使用的时候这样调用:

    <TextBlock
    Text="{Binding Name}"
    converter:TextTrmmingShowToolTip.IsToolTip="True" />

  • 相关阅读:
    动态链接库DLL
    异常处理
    内存
    线程同步
    线程基础、线程调度
    笔记摘录:进程、作业
    工具DebugView、PCHunter、Procexp、Procmon
    使用Windbg和VMware来搭建调试内核的环境
    C++智能指针
    AndroidEventBus
  • 原文地址:https://www.cnblogs.com/sczmzx/p/10593669.html
Copyright © 2011-2022 走看看