wpf datagrid row height 行高自動計算使每行行高自適應文本


wpf 的datagrid的行高 要么是Auto,要么是定值:但會帶來麻煩就是每行行高都一樣。

當需要按內容(主要是wrap 換行的textbox或textblock)來動態調整行高的時候,需要用到dataGrid的LoadingRow 事件。

參考兩個網頁:

http://stackoverflow.com/questions/9264398/how-to-calculate-wpf-textblock-width-for-its-known-font-size-and-characters

 

http://www.codeproject.com/Articles/5521/Advanced-DataGrid-sizing

 

代碼注釋詳細,不做細談。

代碼如下:

 private void dgList_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            e.Row.Height = 30;
            //粗略計算行高。為了更好的顯示效果
           ContentInfo info = (ContentInfo)e.Row.DataContext;
            if (info != null)
            {
                //計算最大長度的文本
                string maxLengthString = info.name1.Length > info.name2.Length ? info.name1: info.name2;
                //獲取換行文本的文本框寬度,即template里面的textbox或textblock的實際寬度
                double textBoxWidth = (this.ActualWidth - 300) / 2;
                 
                var formattedText = new FormattedText(
    maxLengthString ,
    CultureInfo.CurrentUICulture,
    FlowDirection.LeftToRight,
    new Typeface(new FontFamily("微軟雅黑"), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal),
    12,
    Brushes.Black);

                double calculateHeight = formattedText.Height * (formattedText.Width / textBoxWidth);
                e.Row.Height = 30 > calculateHeight ? 30 : calculateHeight;
            }
        }

 效果(每行行高都不一樣,自適應了):

 

感謝每一位閱讀此篇文章的人,希望可以幫到你。

 

2017年7月12日更新:

忘了當初為什么這么做了,好尷尬。但這么做的一個思想是文本區域大小計算吧。

發現wpf的textblock自帶行高計算的。

只要將所有colume設置成模板列,textwrap屬性設置成wrap就行了,這樣也是可以的。測試程序源碼如下:

http://files.cnblogs.com/files/lizhijian/datagrid%E8%A1%8C%E9%AB%98%E6%B5%8B%E8%AF%95.rar

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM