LayoutPanelControl.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*************************************************************************************
  2. Extended WPF Toolkit
  3. Copyright (C) 2007-2013 Xceed Software Inc.
  4. This program is provided to you under the terms of the Microsoft Public
  5. License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
  6. For more features, controls, and fast professional support,
  7. pick up the Plus Edition at http://xceed.com/wpf_toolkit
  8. Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
  9. ***********************************************************************************/
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Windows.Controls;
  15. using System.Windows;
  16. using Xceed.Wpf.AvalonDock.Layout;
  17. namespace Xceed.Wpf.AvalonDock.Controls
  18. {
  19. public class LayoutPanelControl : LayoutGridControl<ILayoutPanelElement>, ILayoutControl
  20. {
  21. internal LayoutPanelControl(LayoutPanel model)
  22. :base(model, model.Orientation)
  23. {
  24. _model = model;
  25. }
  26. LayoutPanel _model;
  27. protected override void OnFixChildrenDockLengths()
  28. {
  29. if (ActualWidth == 0.0 ||
  30. ActualHeight == 0.0)
  31. return;
  32. var modelAsPositionableElement = _model as ILayoutPositionableElementWithActualSize;
  33. #region Setup DockWidth/Height for children
  34. if (_model.Orientation == Orientation.Horizontal)
  35. {
  36. if (_model.ContainsChildOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>())
  37. {
  38. for (int i = 0; i < _model.Children.Count; i++)
  39. {
  40. var childContainerModel = _model.Children[i] as ILayoutContainer;
  41. var childPositionableModel = _model.Children[i] as ILayoutPositionableElement;
  42. if (childContainerModel != null &&
  43. (childContainerModel.IsOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>() ||
  44. childContainerModel.ContainsChildOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>()))
  45. {
  46. childPositionableModel.DockWidth = new GridLength(1.0, GridUnitType.Star);
  47. }
  48. else if (childPositionableModel != null && childPositionableModel.DockWidth.IsStar)
  49. {
  50. var childPositionableModelWidthActualSize = childPositionableModel as ILayoutPositionableElementWithActualSize;
  51. var widthToSet = Math.Max(childPositionableModelWidthActualSize.ActualWidth, childPositionableModel.DockMinWidth);
  52. widthToSet = Math.Min(widthToSet, ActualWidth / 2.0);
  53. widthToSet = Math.Max(widthToSet, childPositionableModel.DockMinWidth);
  54. childPositionableModel.DockWidth = new GridLength(
  55. widthToSet,
  56. GridUnitType.Pixel);
  57. }
  58. }
  59. }
  60. else
  61. {
  62. for (int i = 0; i < _model.Children.Count; i++)
  63. {
  64. var childPositionableModel = _model.Children[i] as ILayoutPositionableElement;
  65. if (!childPositionableModel.DockWidth.IsStar)
  66. {
  67. childPositionableModel.DockWidth = new GridLength(1.0, GridUnitType.Star);
  68. }
  69. }
  70. }
  71. }
  72. else
  73. {
  74. if (_model.ContainsChildOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>())
  75. {
  76. for (int i = 0; i < _model.Children.Count; i++)
  77. {
  78. var childContainerModel = _model.Children[i] as ILayoutContainer;
  79. var childPositionableModel = _model.Children[i] as ILayoutPositionableElement;
  80. if (childContainerModel != null &&
  81. (childContainerModel.IsOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>() ||
  82. childContainerModel.ContainsChildOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>()))
  83. {
  84. childPositionableModel.DockHeight = new GridLength(1.0, GridUnitType.Star);
  85. }
  86. else if (childPositionableModel != null && childPositionableModel.DockHeight.IsStar)
  87. {
  88. var childPositionableModelWidthActualSize = childPositionableModel as ILayoutPositionableElementWithActualSize;
  89. var heightToSet = Math.Max(childPositionableModelWidthActualSize.ActualHeight, childPositionableModel.DockMinHeight);
  90. heightToSet = Math.Min(heightToSet, ActualHeight / 2.0);
  91. heightToSet = Math.Max(heightToSet, childPositionableModel.DockMinHeight);
  92. childPositionableModel.DockHeight = new GridLength(heightToSet, GridUnitType.Pixel);
  93. }
  94. }
  95. }
  96. else
  97. {
  98. for (int i = 0; i < _model.Children.Count; i++)
  99. {
  100. var childPositionableModel = _model.Children[i] as ILayoutPositionableElement;
  101. if (!childPositionableModel.DockHeight.IsStar)
  102. {
  103. childPositionableModel.DockHeight = new GridLength(1.0, GridUnitType.Star);
  104. }
  105. }
  106. }
  107. }
  108. #endregion
  109. }
  110. }
  111. }