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对象传进去就行了。另外如果是其他类型数据源 各位也可以根据实际需求改一下 很简单的。