130517Dev GridControl建立多行复杂表头(Banded View)时,统计列与对应列无法对齐的解决办法
2013-05-17 14:08
513 查看
使用Dev GridControl建立多行复杂表头时,TotalSummaryItem统计列始终无法与对应列对齐,也无法与对应列一起调整宽度。
最终通过Dev官方网站的技术支持那里得到了最终解决办法,公布如下,供大家参考。
具体的实现原理我也不太懂,总而言之,按照该方法,粘贴部分代码到自己的项目中,能够解决问题。
MainWindow.xaml代码:
View Code
类BandedTotalSummaryItemsControl 是重点,必须粘贴;xaml文件中<dxg:TableView.FooterTemplate>... ...</dxg:TableView.FooterTemplate>是重点,必须粘贴。
最终实现效果很好,和WinForm中的效果是一样滴。
最后感谢Dev的工程师。
最终通过Dev官方网站的技术支持那里得到了最终解决办法,公布如下,供大家参考。
具体的实现原理我也不太懂,总而言之,按照该方法,粘贴部分代码到自己的项目中,能够解决问题。
MainWindow.xaml代码:
using System; using System.Windows; using DevExpress.Xpf.Grid; using System.Windows.Controls; using System.Windows.Data; namespace GridExample { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } public class Data { public string First { get; set; } public string Second { get; set; } } public class BandedTotalSummaryItemsControl : TotalSummaryItemsControl { public static readonly DependencyProperty ViewProperty = DependencyProperty.Register("View", typeof(DataViewBase), typeof(BandedTotalSummaryItemsControl), null); public DataViewBase View { get { return (DataViewBase)GetValue(ViewProperty); } set { SetValue(ViewProperty, value); } } public BandedViewBehavior BandBehavior { get { return BandedViewBehavior.GetBandBehaviour((TableView)View); } } Grid LayoutPanel { get { return (Grid)Panel; } } public BandedTotalSummaryItemsControl() { Loaded += OnLoaded; } protected override FrameworkElement CreateChild(object item) { FrameworkElement res = base.CreateChild(item); GridColumnData cellData = (GridColumnData)item; ColumnBase gridColumn = cellData.Column; int row = BandedViewBehavior.GetRow(gridColumn); int column = BandedViewBehavior.GetColumn(gridColumn) + 1; int rowSpan = BandedViewBehavior.GetRowSpan(gridColumn); int columnSpan = BandedViewBehavior.GetColumnSpan(gridColumn); Grid.SetRow(res, row); Grid.SetColumn(res, column); Grid.SetRowSpan(res, rowSpan); Grid.SetColumnSpan(res, columnSpan); if (BandedViewBehavior.GetIsBand(gridColumn)) res.Visibility = Visibility.Collapsed; else res.Visibility = Visibility.Visible; return res; } protected override void ValidateVisualTree() { PreparePanel(); base.ValidateVisualTree(); } void OnLoaded(object sender, RoutedEventArgs e) { ClearPanel(); } void ClearPanel() { if (View == null || LayoutPanel == null) return; InvalidateMeasure(); LayoutPanel.ColumnDefinitions.Clear(); LayoutPanel.RowDefinitions.Clear(); } void PreparePanel() { if (View == null || LayoutPanel == null) return; if (LayoutPanel.ColumnDefinitions.Count != 0 || LayoutPanel.RowDefinitions.Count != 0) return; CreateCorrectingColumn(); foreach (DevExpress.Xpf.Grid.ColumnDefinition columnDefinition in BandBehavior.ColumnDefinitions) LayoutPanel.ColumnDefinitions.Add(columnDefinition.CreateGridColumnDefinition()); foreach (DevExpress.Xpf.Grid.RowDefinition rowDefinition in BandBehavior.RowDefinitions) LayoutPanel.RowDefinitions.Add(rowDefinition.CreateGridRowDefinition()); } void CreateCorrectingColumn() { System.Windows.Controls.ColumnDefinition res = new System.Windows.Controls.ColumnDefinition(); Binding b = new Binding("GroupCount"); b.Source = ((GridControl)View.DataControl); b.Converter = new GridLengthValueConverter(); b.ConverterParameter = ((TableView)View).LeftGroupAreaIndent; BindingOperations.SetBinding(res, System.Windows.Controls.ColumnDefinition.WidthProperty, b); LayoutPanel.ColumnDefinitions.Insert(0, res); Binding b1 = new Binding("Level"); b1.Source = DataContext; b1.Converter = new ValueConverter(); b1.ConverterParameter = ((TableView)View).LeftGroupAreaIndent; BindingOperations.SetBinding(this, CellLayoutControl.MarginProperty, b1); } class ValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { double res = (int)value * (double)parameter; return new Thickness() { Left = -res }; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } } }
View Code
类BandedTotalSummaryItemsControl 是重点,必须粘贴;xaml文件中<dxg:TableView.FooterTemplate>... ...</dxg:TableView.FooterTemplate>是重点,必须粘贴。
最终实现效果很好,和WinForm中的效果是一样滴。
最后感谢Dev的工程师。
相关文章推荐
- 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
- UITableView设置表头后向上拉,表头的解决办法
- SDWebImage在UITableView部分CELL图片无法加载的解决办法
- 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
- SurfaceView绘图时刷新问题,尝试各种办法无法解决,请教高手
- UIScrollView无法滚动可能的原因及解决办法分析
- EasyJSWebView二次加载时JS无法调用原生代码解决办法
- WebView无法播放视频的解决办法
- 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
- 无法获得用户定位信息的解决办法和建立HTTPS的方法
- view中,xp虚拟桌面无法加入2008域的解决办法。
- 远程桌面 客户端无法建立跟远程计算机的连接 解决办法
- 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
- 关于.NET CORE 1.1无法使用PartialView的一种解决办法
- 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
- 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
- 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
- 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
- 一个类对应的一个XIB里面有多个view时,类的属性为NULL的解决办法
- Android 3.0 以上系统 webView 无法在html中传值的解决办法