Silverlight DataGrid自适应数据

silverlight的DataGrid如果改成fill模式 那么当数据超长也不会出现横向滚动条 如果改成按单元格模式 如果数据较短又会出现空白的地方

所以我自己写了个算法 目前实现了以list为数据源的形式 根据数据长短 标题长短 当前实际宽度进行了算法运算 并进行了调整 不多说直接上代码

public static class DataGridHelper
    {
        private static double withunit = 7.2;//单个英文所占像素大小
        private static int hzwithunit = 3;//汉字与应为对比值(1个汉字相当与多少个英文)
        public static void initGrid<T>(List<T> lml,DataGrid DataGrid)
        {
            Dictionary<int, int> dic = new Dictionary<int, int>();
            Dictionary<int, int> dic2 = new Dictionary<int, int>();
            for (int j = 0; j < lml.Count; j++)
            {

                DataGrid.SelectedIndex = j;
                DataGrid.UpdateLayout();
                DataGrid.ScrollIntoView(lml[j], DataGrid.Columns[0]);
                for (int i = 0; i < DataGrid.Columns.Count; i++)
                {
                    T mi = lml[j];
                    string s1 = ((TextBlock)DataGrid.Columns[i].GetCellContent(mi)).Text.ToString();
                    string s2 = DataGrid.Columns[i].Header.ToString();
                    int n1 = 0;
                    int n2 = 0;
                    for (int mm = 0; mm < s1.Length; mm++)
                    {
                        if (((int)s1[mm]) > 127)
                        {
                            n1 = n1 + hzwithunit;
                        }
                        else
                        {
                            n1 = n1 + 1;
                        }
                    }
                    for (int mm = 0; mm < s2.Length; mm++)
                    {
                        if (((int)s2[mm]) > 127)
                        {
                            n2 = n2 + hzwithunit;
                        }
                        else
                        {
                            n2 = n2 + 1;
                        }
                    }
                    if (!dic.Keys.Contains(i))
                    {

                        if (n1 > n2)
                        {
                            dic.Add(i, n1);
                        }
                        else
                        {
                            dic.Add(i, n2);
                        }
                    }
                    else
                    {
                        int s = 0;
                        if (n1 > n2)
                        {
                            s = n1;
                        }
                        else
                        {
                            s = n2;
                        }
                        if (dic[i] < s)
                        {
                            dic[i] = s;
                        }
                    }
                }
            }
            DataGrid.SelectedIndex = 0;
            DataGrid.UpdateLayout();
            DataGrid.ScrollIntoView(lml.First(), DataGrid.Columns[0]);
            setColumnsWith(dic,dic2,DataGrid);
        }
        private static void setColumnsWith(Dictionary<int, int> dic, Dictionary<int, int> dic2, DataGrid DataGrid)
        {
            int n = 1;
            foreach (int i in dic.Values)
            {
                if (n > i)
                {
                    n = i;
                }
            }
            foreach (int k in dic.Keys)
            {
                if (dic[k] % n == 0)
                {
                    if (!dic2.Keys.Contains(k))
                    {
                        dic2.Add(k, dic[k] / n);
                    }
                }
                else
                {
                    if (!dic2.Keys.Contains(k))
                    {
                        dic2.Add(k, (dic[k] / n) + 1);
                    }
                }
            }
            int n1 = 0;
            foreach (int v in dic2.Values)
            {
                n1 = n1 + v;
            }
            if (n1 * withunit < DataGrid.ActualWidth)
            {
                for (int i = 0; i < DataGrid.Columns.Count; i++)
                {
                    DataGrid.Columns[i].Width = new DataGridLength(dic2[i], DataGridLengthUnitType.Star);
                }
            }
            else
            {
                for (int i = 0; i < DataGrid.Columns.Count; i++)
                {
                    DataGrid.Columns[i].Width = new DataGridLength(dic2[i] * withunit);
                }
            }
        }
    }

这里面当数据最大长度比列标题长度短的时候就会采用列宽 当整体宽度小于DataGrid宽度的时候就会按照权重进行分配。调用的时候直接将数据源和DataGrid对象传进去就行了。另外如果是其他类型数据源 各位也可以根据实际需求改一下 很简单的。

原文地址:https://www.cnblogs.com/lgmbk/p/7130602.html