Пример #1
0
 private void GenerateColumns()
 {
     // Create columns
     ColumnDefinitions?.Clear();
     for (int i = 0; i < ColumnCount; i++)
     {
         ColumnDefinitions?.Add(new ColumnDefinition()
         {
             Width = new GridLength(1, GridUnitType.Star)
         });
     }
 }
Пример #2
0
        public void BuildTiles(IEnumerable <object> tiles)
        {
            try
            {
                if (tiles == null || tiles.Count() == 0)
                {
                    Children?.Clear();
                }

                var t     = ItemsSource.GetType();
                var isObs = t.GetTypeInfo().IsGenericType&& ItemsSource.GetType().GetGenericTypeDefinition() == typeof(ObservableCollection <>);
                if (isObs)
                {
                    ObservableSource = new ObservableCollection <object>(ItemsSource.Cast <object>());
                }

                // Wipe out the previous definitions if they're there.
                RowDefinitions?.Clear();
                ColumnDefinitions?.Clear();

                var enumerable   = ObservableSource as IList ?? tiles.ToList();
                var numberOfRows = Math.Ceiling(enumerable.Count / (float)MaxColumns);

                for (var i = 0; i < MaxColumns; i++)
                {
                    ColumnDefinitions.Add(new ColumnDefinition {
                        Width = GridLength.Star
                    });
                }

                for (var i = 0; i < numberOfRows; i++)
                {
                    RowDefinitions?.Add(new RowDefinition {
                        Height = TileHeight
                    });
                }

                for (var index = 0; index < enumerable.Count; index++)
                {
                    var column = index % MaxColumns;
                    var row    = (int)Math.Floor(index / (float)MaxColumns);

                    var tile = BuildTile(enumerable[index]);

                    Children.Add(tile, column, row);
                }
                //ForceLayout();
            }
            catch
            { // can throw exceptions if binding upon disposal
              /*throw new Exception(" Unhandled excepection while building tiles");*/
            }
        }
Пример #3
0
 public LinearLayout()
 {
     Orientation = LayoutSystemOrientation.HORIZONTAL;
     ColumnDefinitions.Clear();
     RowDefinitions.Clear();
 }
Пример #4
0
 public void ClearPanel()
 {
     ColumnDefinitions.Clear();
     RowDefinitions.Clear();
 }
Пример #5
0
        protected void CreateComposite()
        {
            Children.Clear();

            if (!GraphUtil.IsNullNumber <T>(MinValue) && !GraphUtil.IsNullNumber <T>(MaxValue))
            {
                IsRanged = true;

                ColumnDefinitions.Clear();

                ColumnDefinition col0 = new ColumnDefinition();

                T test = default(T);

                if (test is float)
                {
                    col0.Width = new GridLength(UIWpf.GetHorizontalSizeOfCharacterString((int)Math.Ceiling(2 * Math.Log10(Math.Max(GraphUtil.ToInt <T>(MinValue), GraphUtil.ToInt <T>(MaxValue))))));
                }
                else
                {
                    col0.Width = new GridLength(UIWpf.GetHorizontalSizeOfCharacterString((int)Math.Ceiling(Math.Log10(Math.Max(GraphUtil.ToInt <T>(MinValue), GraphUtil.ToInt <T>(MaxValue))))));
                }

                this.ColumnDefinitions.Add(col0);

                ColumnDefinition col1 = new ColumnDefinition();
                col1.Width = new GridLength(5);
                this.ColumnDefinitions.Add(col1);

                ColumnDefinition col2 = new ColumnDefinition();
                col2.Width = new GridLength(1, GridUnitType.Star);
                this.ColumnDefinitions.Add(col2);

                TextBox = new TextBox();
                Grid.SetColumn(TextBox, 0);
                TextBox.TextChanged += new TextChangedEventHandler(OnBoxTextChanged);
                Children.Add(TextBox);

                Slider                     = new MySlider();
                Slider.MinWidth            = 60; //////////////////////////////////////// !!!!!!!!!!!
                Slider.Minimum             = GraphUtil.ToDouble <T>(MinValue);
                Slider.Maximum             = GraphUtil.ToDouble <T>(MaxValue);
                Slider.IsSnapToTickEnabled = true;
                Slider.Foreground          = (Brush)FindResource("0GrayBrush");
                Slider.TickFrequency       = 1;
                Slider.TickPlacement       = TickPlacement.BottomRight;
                Grid.SetColumn(Slider, 2);
                Slider.ValueChanged += new RoutedPropertyChangedEventHandler <double>(OnSliderValueChanged);

                if (Vertex.Get(@"BaseEdge:\Meta:\$UpdateAfterInteractionEnd:") != null)
                {
                    Slider.FireValueChangedOnlyIfDraggingFinished = true;
                }


                Children.Add(Slider);
            }
            else
            {
                TextBox              = new TextBox();
                TextBox.TextChanged += new TextChangedEventHandler(OnBoxTextChanged);
                Children.Add(TextBox);
            }
        }
Пример #6
0
        public void GridShaping()
        {
            //罫線の太さはここで指定。
            var thickness = new GridLength(1);

            // 罫線用の行・列を追加
            var columns = ColumnDefinitions.ToArray();

            ColumnDefinitions.Clear();

            if (columns.Any())
            {
                foreach (var c in columns)
                {
                    ColumnDefinitions.Add(new ColumnDefinition {
                        Width = thickness
                    });
                    ColumnDefinitions.Add(c);
                }
            }
            else
            {
                ColumnDefinitions.Add(new ColumnDefinition {
                    Width = thickness
                });
                ColumnDefinitions.Add(new ColumnDefinition());
            }
            ColumnDefinitions.Add(new ColumnDefinition {
                Width = new GridLength(0.5)
            });

            var rows = RowDefinitions.ToArray();

            RowDefinitions.Clear();

            if (rows.Any())
            {
                foreach (var r in rows)
                {
                    RowDefinitions.Add(new RowDefinition {
                        Height = thickness
                    });
                    RowDefinitions.Add(r);
                }
            }
            else
            {
                RowDefinitions.Add(new RowDefinition {
                    Height = thickness
                });
                RowDefinitions.Add(new RowDefinition());
            }
            RowDefinitions.Add(new RowDefinition {
                Height = thickness
            });

            //行・列を追加した分、Column,Row,ColumnSpan,RowSpanがずれるのでその補正再設定
            foreach (UIElement c in Children)
            {
                SetColumn(c, GetColumn(c) * 2 + 1);
                SetColumnSpan(c, GetColumnSpan(c) * 2 - 1);
                SetRow(c, GetRow(c) * 2 + 1);
                SetRowSpan(c, GetRowSpan(c) * 2 - 1);
            }

            //罫線用に追加した行・列にRectangleを配置
            for (var i = 0; i < ColumnDefinitions.Count; i += 2)
            {
                var rectangle = new Rectangle()
                {
                    Fill = Brushes.Black
                };
                Children.Add(rectangle);
                SetColumn(rectangle, i);
                SetRowSpan(rectangle, RowDefinitions.Count);
                SetZIndex(rectangle, int.MinValue);
            }
            for (var i = 0; i < RowDefinitions.Count; i += 2)
            {
                var rectangle = new Rectangle()
                {
                    Fill = Brushes.Black
                };
                Children.Add(rectangle);
                SetRow(rectangle, i);
                SetColumnSpan(rectangle, ColumnDefinitions.Count);
                SetZIndex(rectangle, int.MinValue);
            }
        }
Пример #7
0
        private void UpdateRowColDefinitions()
        {
            var root = _model.Root;

            if (root == null)
            {
                return;
            }
            var manager = root.Manager;

            if (manager == null)
            {
                return;
            }

            FixChildrenDockLengths();

            //Debug.Assert(InternalChildren.Count == _model.ChildrenCount + (_model.ChildrenCount - 1));

            #region Setup GridRows/Cols
            RowDefinitions.Clear();
            ColumnDefinitions.Clear();
            if (Orientation == Orientation.Horizontal)
            {
                int iColumn = 0;
                int iChild  = 0;
                for (int iChildModel = 0; iChildModel < _model.Children.Count; iChildModel++, iColumn++, iChild++)
                {
                    var childModel = _model.Children[iChildModel] as ILayoutPositionableElement;
                    ColumnDefinitions.Add(new ColumnDefinition()
                    {
                        Width    = childModel.IsVisible ? childModel.DockWidth : new GridLength(0.0, GridUnitType.Pixel),
                        MinWidth = childModel.IsVisible ? childModel.CalculatedDockMinWidth() : 0.0
                    });
                    Grid.SetColumn(InternalChildren[iChild], iColumn);

                    //append column for splitter
                    if (iChild < InternalChildren.Count - 1)
                    {
                        iChild++;
                        iColumn++;

                        bool nextChildModelVisibleExist = false;
                        for (int i = iChildModel + 1; i < _model.Children.Count; i++)
                        {
                            var nextChildModel = _model.Children[i] as ILayoutPositionableElement;
                            if (nextChildModel.IsVisible)
                            {
                                nextChildModelVisibleExist = true;
                                break;
                            }
                        }

                        ColumnDefinitions.Add(new ColumnDefinition()
                        {
                            Width = childModel.IsVisible && nextChildModelVisibleExist ? new GridLength(manager.GridSplitterWidth) : new GridLength(0.0, GridUnitType.Pixel)
                        });
                        Grid.SetColumn(InternalChildren[iChild], iColumn);
                    }
                }
            }
            else //if (_model.Orientation == Orientation.Vertical)
            {
                int iRow   = 0;
                int iChild = 0;
                for (int iChildModel = 0; iChildModel < _model.Children.Count; iChildModel++, iRow++, iChild++)
                {
                    var childModel = _model.Children[iChildModel] as ILayoutPositionableElement;
                    RowDefinitions.Add(new RowDefinition()
                    {
                        Height    = childModel.IsVisible ? childModel.DockHeight : new GridLength(0.0, GridUnitType.Pixel),
                        MinHeight = childModel.IsVisible ? childModel.CalculatedDockMinHeight() : 0.0
                    });
                    Grid.SetRow(InternalChildren[iChild], iRow);

                    //if (RowDefinitions.Last().Height.Value == 0.0)
                    //    System.Diagnostics.Debugger.Break();

                    //append row for splitter (if necessary)
                    if (iChild < InternalChildren.Count - 1)
                    {
                        iChild++;
                        iRow++;

                        bool nextChildModelVisibleExist = false;
                        for (int i = iChildModel + 1; i < _model.Children.Count; i++)
                        {
                            var nextChildModel = _model.Children[i] as ILayoutPositionableElement;
                            if (nextChildModel.IsVisible)
                            {
                                nextChildModelVisibleExist = true;
                                break;
                            }
                        }

                        RowDefinitions.Add(new RowDefinition()
                        {
                            Height = childModel.IsVisible && nextChildModelVisibleExist ? new GridLength(manager.GridSplitterHeight) : new GridLength(0.0, GridUnitType.Pixel)
                        });
                        //if (RowDefinitions.Last().Height.Value == 0.0)
                        //    System.Diagnostics.Debugger.Break();
                        Grid.SetRow(InternalChildren[iChild], iRow);
                    }
                }
            }

            #endregion
        }
Пример #8
0
 public AutoLayoutGrid()
 {
     RowDefinitions.Clear();
     ColumnDefinitions.Clear();
 }
Пример #9
0
 private void Clear()
 {
     ColumnDefinitions.Clear();
     Children.Clear();
 }
Пример #10
0
        private void SetUI()
        {
            this.Dispatcher.Invoke(() =>
            {
                ColumnDefinitions.Clear();
                RowDefinitions.Clear();
                Children.Clear();
                _cardControls.Clear();

                // Set rows
                ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = new GridLength(2, GridUnitType.Star)
                });
                ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = new GridLength(40, GridUnitType.Star)
                });
                ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = new GridLength(40, GridUnitType.Star)
                });
                ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = new GridLength(2, GridUnitType.Star)
                });

                int row = 0;

                foreach (var cardIo in InternalCards)
                {
                    RowDefinitions.Add(new RowDefinition()
                    {
                        Height = new GridLength(50)
                    });

                    // Create Background
                    var rect = new Rectangle()
                    {
                        Fill   = Application.Current.Resources["SpectrumCardSide"] as Brush,
                        Margin = new Thickness(2)
                    };
                    SetColumn(rect, 0);
                    SetRow(rect, row);
                    Children.Add(rect);

                    rect = new Rectangle()
                    {
                        Fill   = Application.Current.Resources["SpectrumCardDarkBackground"] as Brush,
                        Margin = new Thickness(2)
                    };
                    SetColumn(rect, 1);
                    SetRow(rect, row);
                    Children.Add(rect);

                    rect = new Rectangle()
                    {
                        Fill   = Application.Current.Resources["SpectrumCardDarkBackground"] as Brush,
                        Margin = new Thickness(2)
                    };
                    SetColumn(rect, 2);
                    SetRow(rect, row);
                    Children.Add(rect);

                    rect = new Rectangle()
                    {
                        Fill   = Application.Current.Resources["SpectrumCardSide"] as Brush,
                        Margin = new Thickness(2)
                    };
                    SetColumn(rect, 3);
                    SetRow(rect, row);
                    Children.Add(rect);

                    var control      = new CardControl(cardIo);
                    control.OnClick += card =>
                    {
                        if (OnCardSelected != null)
                        {
                            OnCardSelected(card);
                        }
                        SelectedCard = card;
                    };
                    _cardControls.Add(control);
                    // Create Canvases
                    var canvas = new CustomCanvas(
                        (c) =>
                    {
                        c.Children.Add(control);
                        return(true);
                    },
                        (c) =>
                    {
                        var px   = c.ActualWidth / 2000 * (cardIo.CenterFrequency - 100);
                        var size = c.ActualWidth / 2000 * 200;

                        control.Width  = size;
                        control.Height = c.ActualHeight;
                        Canvas.SetLeft(control, px);
                        Canvas.SetTop(control, 0);
                    });
                    SetRow(canvas, row);
                    SetColumn(canvas, 1);
                    SetColumnSpan(canvas, 2);
                    Children.Add(canvas);



                    row += 1;
                }
                RowDefinitions.Add(new RowDefinition()
                {
                    Height = new GridLength(25)
                });
                var zero = new Label {
                    Content = "0 Mhz", HorizontalAlignment = HorizontalAlignment.Left
                };
                Children.Add(zero);
                SetColumn(zero, 1);
                SetRow(zero, row);

                var half = new Label
                {
                    Content             = "1000 Mhz",
                    HorizontalAlignment = HorizontalAlignment.Left,
                    Margin = new Thickness(-25, 0, 0, 0)
                };
                Children.Add(half);
                SetColumn(half, 2);
                SetRow(half, row);

                var full = new Label {
                    Content = "2000 Mhz", HorizontalAlignment = HorizontalAlignment.Right
                };
                Children.Add(full);
                SetColumn(full, 2);
                SetRow(full, row);


                ManageSelected(null, SelectedCard);
            });
        }
Пример #11
0
        private void UpdateRowColumnInfo()
        {
            Children.Clear();
            RowDefinitions.Clear();
            ColumnDefinitions.Clear();

            if (oldFirstSize == default(GridLength))
            {
                oldFirstSize = FirstChildRelativeSize;
            }

            if (oldSecondSize == default(GridLength))
            {
                oldSecondSize = SecondChildRelativeSize;
            }

            if (Orientation == Orientation.Horizontal)
            {
                ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = oldFirstSize
                });
                ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = separatorSize
                });
                ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = oldSecondSize
                });
                RowDefinitions.Add(new RowDefinition());
                SetRow(gridSplitter, 0);
                SetColumn(gridSplitter, 1);
                gridSplitter.ResizeDirection     = GridResizeDirection.Columns;
                gridSplitter.Width               = 5;
                gridSplitter.HorizontalAlignment = HorizontalAlignment.Stretch;
                gridSplitter.VerticalAlignment   = VerticalAlignment.Stretch;
            }
            else
            {
                RowDefinitions.Add(new RowDefinition()
                {
                    Height = oldFirstSize
                });
                RowDefinitions.Add(new RowDefinition()
                {
                    Height = separatorSize
                });
                RowDefinitions.Add(new RowDefinition()
                {
                    Height = oldSecondSize
                });
                ColumnDefinitions.Add(new ColumnDefinition());
                SetRow(gridSplitter, 1);
                SetColumn(gridSplitter, 0);
                gridSplitter.ResizeDirection     = GridResizeDirection.Rows;
                gridSplitter.Height              = 5;
                gridSplitter.HorizontalAlignment = HorizontalAlignment.Stretch;
                gridSplitter.VerticalAlignment   = VerticalAlignment.Stretch;
            }

            if (FirstChild != null)
            {
                SetRow(FirstChild, 0);
                SetColumn(FirstChild, 0);
                SetRowSpan(FirstChild, 1);
                SetColumnSpan(FirstChild, 1);
                Children.Add(FirstChild);
            }

            Children.Add(gridSplitter);

            if (SecondChild != null)
            {
                if (Orientation == Orientation.Horizontal)
                {
                    SetRow(SecondChild, 0);
                    SetColumn(SecondChild, 2);
                }
                else
                {
                    SetRow(SecondChild, 2);
                    SetColumn(SecondChild, 0);
                }

                SetRowSpan(SecondChild, 1);
                SetColumnSpan(SecondChild, 1);
                Children.Add(SecondChild);
            }

            UpdateSplitterVisibility();
        }
Пример #12
0
        void RedoGridLayout()
        {
            // Get the amount to stagger the row start by.
            var stagger = Stagger;

            // The column to absorb the additional stagger amount.
            var staggerFillColumn = -1;

            // Count the number of column spans and find the index of the column to absorb any
            // excess left by staggering the first column.
            var columnSpans = (int)Math.Ceiling(stagger);

            for (var index = 0; index < Children.Count; index++)
            {
                var child = (DependencyObject)Children[index];

                var columnSpan = (int)child.GetValue(ColumnSpanProperty);
                columnSpans += columnSpan;
            }

            // If no column marked to absorb any excess stagger amount...
            if (staggerFillColumn == -1)
            {
                // ...and the excess to the last column.
                staggerFillColumn = Children.Count - 1;
            }

            // We're going to rebuild to columns.
            ColumnDefinitions.Clear();
            var column = 0;

            // If there's a stagger, emit an initial column.
            if (stagger != 0)
            {
                AddStarColumn(stagger);
                column++;
            }

            // Layout the columns.
            for (var index = 0; index < Children.Count; index++)
            {
                var child = (DependencyObject)Children[index];

                var columnSpan = (int)child.GetValue(ColumnSpanProperty);
                var stars      = 1.0;
                if (index == staggerFillColumn)
                {
                    stars += Math.Ceiling(stagger) - stagger;
                }
                AddStarColumn(stars);

                child.SetValue(ColumnProperty, column);
                column++;

                // Add spanned columns.
                for (var span = 1; span < columnSpan; span++)
                {
                    AddStarColumn(1);
                    column++;
                }
            }
        }
Пример #13
0
        /// <summary>
        /// Updates the panel.
        /// </summary>
        private void UpdatePanel()
        {
            if (!Children.Any(x => !_measured_childs.Contains(x)))
            {
                return;
            }

            RowDefinitions.Clear();
            ColumnDefinitions.Clear();


            if (Orientation == Orientation.Vertical)
            {
                for (int i = 0; i < Children.Count; i++)
                {
                    FrameworkElement element = Children[i] as FrameworkElement;

                    _measured_childs.Add(element);

                    if (i < Children.Count - 1)
                    {
                        RowDefinitions.Add(new RowDefinition()
                        {
                            Height = new GridLength(1, GridUnitType.Star)
                        });
                        Grid.SetRow(element, i);

                        //if (element.DataContext is GraphAxisTickData)
                        //{
                        //    (element.DataContext as GraphAxisTickData).Row = i;
                        //}

                        element.VerticalAlignment = VerticalAlignment.Top;

                        element.SizeChanged += (_, __) =>
                        {
                            element.Margin = new Thickness(0, (element.ActualHeight / 2) * -1, 0, 0);
                        };
                    }
                    else
                    {
                        Grid.SetRow(element, i);

                        //if (element.DataContext is GraphAxisTickData)
                        //{
                        //    (element.DataContext as GraphAxisTickData).Row = i;
                        //}

                        element.VerticalAlignment = VerticalAlignment.Bottom;

                        element.SizeChanged += (_, __) =>
                        {
                            element.Margin = new Thickness(0, 0, 0, (element.ActualHeight / 2) * -1);
                        };
                    }
                }
            }
            else
            {
                for (int i = 0; i < Children.Count; i++)
                {
                    FrameworkElement element = Children[i] as FrameworkElement;

                    _measured_childs.Add(element);

                    if (i < Children.Count - 1)
                    {
                        ColumnDefinitions.Add(new ColumnDefinition()
                        {
                            Width = new GridLength(1, GridUnitType.Star)
                        });
                        Grid.SetColumn(element, i);
                        element.HorizontalAlignment = HorizontalAlignment.Left;

                        //if (element.DataContext is GraphAxisTickData)
                        //{
                        //    (element.DataContext as GraphAxisTickData).Column = i;
                        //}

                        element.SizeChanged += (_, __) =>
                        {
                            element.Margin = new Thickness((element.ActualWidth / 2) * -1, 0, 0, 0);
                        };
                    }
                    else
                    {
                        Grid.SetColumn(element, i);
                        element.HorizontalAlignment = HorizontalAlignment.Right;

                        //if (element.DataContext is GraphAxisTickData)
                        //{
                        //    (element.DataContext as GraphAxisTickData).Column = i;
                        //}

                        element.SizeChanged += (_, __) =>
                        {
                            element.Margin = new Thickness(0, 0, (element.ActualWidth / 2) * -1, 0);
                        };
                    }
                }
            }
        }
Пример #14
0
        void UpdateChildren()
        {
            List <string> variables;
            List <string> results;
            Dictionary <string, List <string> > varValues;
            var useResults = MultiRow ? Math.Max(0, (int)((ActualHeight - Spacing * 2) / RowHeight - 1)) : MaxResults;

            try
            {
                var expression = new NEExpression(Expression);
                variables = new List <string>(expression.Variables);
                var resultCount = Math.Min(NumResults ?? ResultCount, useResults);
                results      = expression.EvaluateList <string>(Variables, resultCount).Coalesce("").ToList();
                varValues    = variables.ToDictionary(variable => variable, variable => Variables.GetValues(variable, resultCount).Select(val => val?.ToString()).ToList());
                IsValid      = true;
                ErrorMessage = null;
            }
            catch (Exception ex)
            {
                results      = MultiRow ? Enumerable.Repeat(default(string), useResults).ToList() : new List <string>();
                variables    = new List <string>();
                varValues    = new Dictionary <string, List <string> >();
                IsValid      = false;
                ErrorMessage = ex.Message;
                if ((Children.Count != 0) || (ActualHeight == 0) || (ActualWidth == 0))
                {
                    return;
                }
            }

            Children.Clear();
            ColumnDefinitions.Clear();
            RowDefinitions.Clear();

            Func <WidthType, int, Tuple <WidthType, List <FrameworkElement> > > GetLine = (widthType, numRows) => Tuple.Create(widthType, Enumerable.Range(0, numRows).Select(row => new Rectangle {
                Width = Spacing, Fill = BackColor
            }).Cast <FrameworkElement>().ToList());

            var columns = new List <Tuple <WidthType, List <FrameworkElement> > >();

            if (MultiRow)
            {
                Func <WidthType, int, Tuple <WidthType, List <FrameworkElement> > > GetSpace = (widthType, numRows) => Tuple.Create(widthType, new[] { new Rectangle {
                                                                                                                                                           Width = Spacing, Fill = BackColor
                                                                                                                                                       } }.Concat(Enumerable.Range(0, numRows - 1).Select(row => new Rectangle {
                    Width = Spacing
                })).Cast <FrameworkElement>().ToList());
                columns.Add(GetLine(WidthType.None, results.Count + 1));
                columns.AddRange(variables.SelectMany(variable => new[] {
                    GetSpace(WidthType.Shrink3, results.Count + 1),
                    Tuple.Create(WidthType.Expand | WidthType.Shrink4, new[] { GetTextBlock(variable, BackColor) }.Concat(Enumerable.Range(0, results.Count).Select(result => GetTextBlock(varValues[variable][result]))).ToList()),
                    GetSpace(WidthType.Shrink3, results.Count + 1),
                    GetLine(WidthType.Shrink5, results.Count + 1),
                }));
                if (!variables.Any())
                {
                    columns.Add(GetSpace(WidthType.Shrink3, results.Count + 1));
                    columns.Add(Tuple.Create(WidthType.Expand | WidthType.Shrink4, new[] { GetTextBlock("", BackColor) }.Concat(results.Select(result => GetTextBlock("<No vars>"))).ToList()));
                    columns.Add(GetSpace(WidthType.Shrink3, results.Count + 1));
                    columns.Add(GetLine(WidthType.Shrink5, results.Count + 1));
                }

                columns.Add(Tuple.Create(WidthType.Shrink1, new[] { default(TextBlock) }.Concat(results.Select(result => GetTextBlock(" => "))).ToList()));
                columns.Add(GetLine(WidthType.Shrink2, results.Count + 1));

                columns.Add(Tuple.Create(WidthType.Shrink6, new[] { new Rectangle {
                                                                        Width = Spacing, Fill = BackColor
                                                                    } }.Concat(Enumerable.Repeat(default(FrameworkElement), results.Count)).ToList()));
                columns.Add(Tuple.Create(WidthType.Expand | WidthType.Shrink7, new[] { GetTextBlock("Result", BackColor) }.Concat(results.Select(result => GetTextBlock(result))).ToList()));
                columns.Add(Tuple.Create(WidthType.Shrink6, new[] { new Rectangle {
                                                                        Width = Spacing, Fill = BackColor
                                                                    } }.Concat(Enumerable.Repeat(default(FrameworkElement), results.Count)).ToList()));

                columns.Add(GetLine(WidthType.None, results.Count + 1));
            }
            else
            {
                Func <WidthType, Tuple <WidthType, List <FrameworkElement> > > GetSpace = widthType => Tuple.Create(widthType, new[] { new Rectangle {
                                                                                                                                           Width = Spacing
                                                                                                                                       } }.Cast <FrameworkElement>().ToList());
                columns.Add(GetLine(WidthType.None, 1));
                if (results.Count == 0)
                {
                    columns.Add(Tuple.Create(WidthType.Expand | WidthType.Shrink1, new List <FrameworkElement> {
                        default(FrameworkElement)
                    }));
                    columns.Add(GetLine(WidthType.None, 1));
                }
                else
                {
                    columns.AddRange(results.SelectMany(result => new[] {
                        GetSpace(WidthType.Shrink1),
                        Tuple.Create(WidthType.Expand | WidthType.Shrink2, new List <FrameworkElement> {
                            GetTextBlock(result)
                        }),
                        GetSpace(WidthType.Shrink1),
                        GetLine(WidthType.Shrink3, 1),
                    }).ToList());
                }
            }

            // Sanity check: should have same number on all columns
            if (columns.Select(column => column.Item2.Count).Distinct().Count() != 1)
            {
                throw new Exception("Column counts don't match");
            }

            // Measure everything
            var margin = new Thickness(0);
            var size   = new Size(double.PositiveInfinity, double.PositiveInfinity);

            columns.SelectMany(column => column.Item2).Where(element => element != null).ForEach(element => { element.Margin = margin; element.Measure(size); });
            const int precision = 10000;
            var       widths    = columns.Select(column => (int)(column.Item2.Max(text => text?.DesiredSize.Width * precision) ?? 0)).ToList();
            var       available = Math.Max(0, (int)ActualWidth * precision);

            // Expand as necessary
            var expandIndexes  = columns.Indexes(column => column.Item1.HasFlag(WidthType.Expand)).ToList();
            var extraPerColumn = (available - widths.Sum()) / expandIndexes.Count;

            if (extraPerColumn > 0)
            {
                expandIndexes.ForEach(index => widths[index] += extraPerColumn);
            }

            // Shrink as necessary
            var shrinks = new[] { WidthType.Shrink1, WidthType.Shrink2, WidthType.Shrink3, WidthType.Shrink4, WidthType.Shrink5, WidthType.Shrink6, WidthType.Shrink7 };

            foreach (var shrink in shrinks)
            {
                var shrinkIndexes = columns.Indexes(column => column.Item1.HasFlag(shrink)).ToList();
                while ((widths.Sum() > available) && (shrinkIndexes.Any(index => widths[index] != 0)))
                {
                    var shrinkWidths  = shrinkIndexes.Select(column => widths[column]).OrderByDescending().Distinct().ToList();
                    var maxIndexes    = shrinkIndexes.Where(column => widths[column] == shrinkWidths[0]).ToList();
                    var minWidth      = shrinkWidths.Count > 1 ? shrinkWidths[1] : 0;
                    var extraPerIndex = (widths.Sum() - available + maxIndexes.Count - 1) / maxIndexes.Count;
                    maxIndexes.ForEach(column => widths[column] = Math.Max(minWidth, widths[column] - extraPerIndex));
                }
            }

            var rows = columns[0].Item2.Count;

            RowDefinitions.Add(new RowDefinition {
                Height = new GridLength(Spacing)
            });
            for (var row = 0; row < rows; ++row)
            {
                RowDefinitions.Add(new RowDefinition {
                    Height = new GridLength(RowHeight)
                });
            }
            RowDefinitions.Add(new RowDefinition {
                Height = new GridLength(Spacing)
            });

            for (var column = 0; column < columns.Count; ++column)
            {
                ColumnDefinitions.Add(new ColumnDefinition {
                    Width = new GridLength((double)widths[column] / precision)
                });
                for (var row = 0; row < rows; ++row)
                {
                    AddChild(columns[column].Item2[row], row + 1, column);
                }
            }

            AddChild(new Rectangle {
                Fill = BackColor, Height = Spacing
            }, 0, 0, columnSpan: ColumnDefinitions.Count);
            AddChild(new Rectangle {
                Fill = BackColor, Height = Spacing
            }, RowDefinitions.Count - 1, 0, columnSpan: ColumnDefinitions.Count);

            GetErrorControls().ForEach(control => AddChild(control, 0, 0, RowDefinitions.Count, ColumnDefinitions.Count));
        }
        /// <summary>
        /// Updates the panel.
        /// </summary>
        public void UpdatePanel()
        {
            RowDefinitions.Clear();
            ColumnDefinitions.Clear();


            if (Orientation == Orientation.Vertical)
            {
                for (int i = 0; i < InternalChildren.Count; i++)
                {
                    FrameworkElement element = InternalChildren[i] as FrameworkElement;

                    if (i < InternalChildren.Count - 1)
                    {
                        RowDefinitions.Add(new RowDefinition()
                        {
                            Height = new GridLength(1, GridUnitType.Star)
                        });
                        Grid.SetRow(element, i);
                        element.VerticalAlignment = VerticalAlignment.Top;

                        element.SizeChanged += (_, __) =>
                        {
                            element.Margin = new Thickness(0, (element.ActualHeight / 2) * -1, 0, 0);
                        };
                    }
                    else
                    {
                        Grid.SetRow(element, i);
                        element.VerticalAlignment = VerticalAlignment.Bottom;

                        element.SizeChanged += (_, __) =>
                        {
                            element.Margin = new Thickness(0, 0, 0, (element.ActualHeight / 2) * -1);
                        };
                    }
                }
            }
            else
            {
                for (int i = 0; i < InternalChildren.Count; i++)
                {
                    FrameworkElement element = InternalChildren[i] as FrameworkElement;

                    if (i < InternalChildren.Count - 1)
                    {
                        ColumnDefinitions.Add(new ColumnDefinition()
                        {
                            Width = new GridLength(1, GridUnitType.Star)
                        });
                        Grid.SetColumn(element, i);
                        element.HorizontalAlignment = HorizontalAlignment.Left;

                        element.SizeChanged += (_, __) =>
                        {
                            element.Margin = new Thickness((element.ActualWidth / 2) * -1, 0, 0, 0);
                        };
                    }
                    else
                    {
                        Grid.SetColumn(element, i);
                        element.HorizontalAlignment = HorizontalAlignment.Right;

                        element.SizeChanged += (_, __) =>
                        {
                            element.Margin = new Thickness(0, 0, (element.ActualWidth / 2) * -1, 0);
                        };
                    }
                }
            }
        }
Пример #16
0
        void buildTable()
        {
            Debug.WriteLine("[buildTable() started]");

            if (columnSource == null || rowsSource == null)
            {
                return;
            }

            //clear table
            Children.Clear();
            ColumnDefinitions.Clear();
            RowDefinitions.Clear();

            RowDefinitions.Add(new RowDefinition
            {
                Height = new GridLength(1, GridUnitType.Auto),
            });

            var x = 0;

            //process columns
            foreach (var column in columnSource)
            {
                var headerCell = new ContentControl();
                headerCell.HorizontalAlignment        = HorizontalAlignment.Stretch;
                headerCell.HorizontalContentAlignment = HorizontalAlignment.Stretch;

                //apply first header template if first header column and first cell template supplied
                if (x == 0 && firstHeaderTemplate != null)
                {
                    headerCell.ContentTemplate = firstHeaderTemplate;
                }
                else
                {
                    headerCell.ContentTemplate = headerTemplate;
                }

                headerCell.Content = column.Header;

                ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = new GridLength(1, column.IsAutoWidth ? GridUnitType.Auto : GridUnitType.Star),
                });

                SetColumn(headerCell, x);
                SetRow(headerCell, 0);

                Children.Add(headerCell);

                var y = 1;

                //process rows
                foreach (var row in rowsSource)
                {
                    var rowCell = new ContentControl();
                    rowCell.HorizontalAlignment        = HorizontalAlignment.Stretch;
                    rowCell.HorizontalContentAlignment = HorizontalAlignment.Stretch;

                    //apply first header template if first header column and first cell template supplied
                    if (x == 0 && firstCellTemplate != null)
                    {
                        rowCell.ContentTemplate = firstCellTemplate;
                    }
                    else
                    {
                        rowCell.ContentTemplate = cellTemplate;
                    }

                    rowCell.DataContext = row;
                    BindingOperations.SetBinding(rowCell, ContentControl.ContentProperty, column.CellDataBinding);

                    if (RowDefinitions.Count - 1 < y)
                    {
                        RowDefinitions.Add(new RowDefinition()
                        {
                            Height = new GridLength(1, GridUnitType.Auto),
                        });
                    }

                    SetColumn(rowCell, x);
                    SetRow(rowCell, y);

                    Children.Add(rowCell);

                    y++;
                }

                x++;
            }

            Debug.WriteLine("[buildTable() completed]");
        }
Пример #17
0
        protected void UpdateControls()
        {
            ColumnDefinitions.Clear();
            RowDefinitions.Clear();

            if (Children.Count == 0)
            {
                return;
            }

            GridLength gr;

            if (Orientation == LayoutOrientation.Horizontal)
            {
                gr = HorizontalOptions.Alignment == LayoutAlignment.Fill ? GridLength.Star : GridLength.Auto;

                RowDefinitions.Add(new RowDefinition {
                    Height = ButtonHeight > 0 ? ButtonHeight : GridLength.Auto
                });
                RowDefinitions.Add(new RowDefinition {
                    Height = SelectorSize
                });
            }
            else
            {
                gr = VerticalOptions.Alignment == LayoutAlignment.Fill ? GridLength.Star : GridLength.Auto;

                ColumnDefinitions.Add(new ColumnDefinition {
                    Width = SelectorSize
                });
                ColumnDefinitions.Add(new ColumnDefinition {
                    Width = ButtonWidth > 0 ? ButtonWidth : GridLength.Star
                });
            }

            for (int i = 0; i < Children.Count; i++)
            {
                var child = Children[i] as TabButton;
                if (child == null)
                {
                    continue;
                }

                child.HorizontalOptions = ButtonWidth > 0 ? LayoutOptions.Fill : HorizontalOptions.Alignment == LayoutAlignment.Fill ? LayoutOptions.Fill : LayoutOptions.CenterAndExpand;
                child.VerticalOptions   = ButtonHeight > 0 ? LayoutOptions.Fill : VerticalOptions.Alignment == LayoutAlignment.Fill ? LayoutOptions.Fill : LayoutOptions.CenterAndExpand;

                if (Orientation == LayoutOrientation.Horizontal)
                {
                    ColumnDefinitions.Add(new ColumnDefinition {
                        Width = ButtonWidth > 0 ? ButtonWidth : gr
                    });

                    Grid.SetColumn(child, i);
                    Grid.SetRow(child, 0);

                    // collapse cells if the children are invisible
                    if (!child.IsVisible)
                    {
                        ColumnDefinitions[i].Width = 0;
                    }
                }
                else
                {
                    RowDefinitions.Add(new RowDefinition {
                        Height = ButtonHeight > 0 ? ButtonHeight : gr
                    });

                    Grid.SetColumn(child, 1);
                    Grid.SetRow(child, i);

                    // collapse cells if the children are invisible
                    if (!child.IsVisible)
                    {
                        RowDefinitions[i].Height = 0;
                    }
                }
            }

            // NOTE: we can't change selector children add/remove during collectionchanged event
            InvokeSelector();
        }
Пример #18
0
        public void Render(int width)
        {
            DataWidth = width;
            _N.SetNewWidth(width);
            Children.Clear();
            ColumnDefinitions.Clear();
            Width = CalcPanelWidth(DataWidth);

            Label hexLb = new Label();

            hexLb.Content             = "HEX: ";
            hexLb.HorizontalAlignment = HorizontalAlignment.Right;
            Label decLb = new Label();

            decLb.Content             = "DEC: ";
            decLb.HorizontalAlignment = HorizontalAlignment.Right;
            TextBox hexTb = new TextBox();

            hexTb.Text = _N.ToString("X");
            TextBox decTb = new TextBox();

            decTb.Text = _N.ToString("D");

            int hexLbStart = 0;
            int hexLbWidth = Min(3, width / 3);
            int hexTbStart = hexLbStart + hexLbWidth;
            int hexTbWidth = Min(8, width / 3);
            int decLbStart = hexTbStart + hexTbWidth;
            int decLbWidth = Min(3, width / 3);
            int decTbStart = decLbStart + decLbWidth;
            int decTbWidth = hexTbWidth;

            SetRow(hexLb, 0);
            SetRow(hexTb, 0);
            SetRow(decLb, 0);
            SetRow(decTb, 0);
            SetColumn(hexLb, hexLbStart);
            SetColumnSpan(hexLb, hexLbWidth);
            SetColumn(hexTb, hexTbStart);
            SetColumnSpan(hexTb, hexTbWidth);
            SetColumn(decLb, decLbStart);
            SetColumnSpan(decLb, decLbWidth);
            SetColumn(decTb, decTbStart);
            SetColumnSpan(decTb, decTbWidth);
            Children.Add(hexLb);
            Children.Add(hexTb);
            Children.Add(decLb);
            Children.Add(decTb);
            hexTb.KeyDown     += HexTb_KeyDown;
            hexTb.TextChanged += HexTb_TextChanged;
            decTb.KeyDown     += DecTb_KeyDown;
            decTb.TextChanged += DecTb_TextChanged;

            for (int i = 0; i < DataWidth; i += 1)
            {
                Label lb = new Label();
                lb.Content = (width - 1 - i).ToString();
                lb.VerticalContentAlignment   = VerticalAlignment.Center;
                lb.HorizontalContentAlignment = HorizontalAlignment.Center;
                lb.Height = _LabelHeight;
                lb.Width  = _LabelWidth;
                SetColumn(lb, i);
                SetRow(lb, 1);

                TextBox tb = new TextBox();
                tb.Text = _N.GetBit(i).ToString();
                if (tb.Text == "1")
                {
                    tb.Background = _TextBoxOneBg;
                }
                else
                {
                    tb.Background = _TextBoxZeroBg;
                }
                tb.HorizontalContentAlignment = HorizontalAlignment.Center;
                tb.VerticalContentAlignment   = VerticalAlignment.Center;
                tb.Height            = _TextBoxHeight;
                tb.Width             = _TextBoxWidth;
                tb.Tag               = (width - 1 - i).ToString();
                tb.Margin            = new Thickness(_TextBoxLeftMargin, _TextBoxTopMargin, _TextBoxRightMargin, _TextBoxBottomMargin);
                tb.KeyDown          += OnTextBoxKeyPress;
                tb.PreviewMouseDown += OnTextBoxMouseClick;
                ColumnDefinition col = new ColumnDefinition();
                ColumnDefinitions.Add(col);
                SetColumn(tb, i);
                SetRow(tb, 2);


                Children.Add(tb);
                Children.Add(lb);
            }

            if (_DecTbEdit == true)
            {
                _DecTbEdit = false;
                decTb.Focus();
                decTb.SelectionStart = decTb.Text.Length;
            }
            if (_HexTbEdit == true)
            {
                _HexTbEdit = false;
                hexTb.Focus();
                hexTb.SelectionStart = hexTb.Text.Length;
            }
        }
        private void UpdateRowColumnInfo()
        {
            Children.Clear();
            RowDefinitions.Clear();
            ColumnDefinitions.Clear();

            if (Orientation == Orientation.Horizontal)
            {
                ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = new GridLength(1.0, GridUnitType.Star)
                });
                ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = new GridLength(5)
                });
                ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = new GridLength(3.0, GridUnitType.Star)
                });
                RowDefinitions.Add(new RowDefinition());
                SetRow(gridSplitter, 0);
                SetColumn(gridSplitter, 1);
                gridSplitter.ResizeDirection     = GridResizeDirection.Columns;
                gridSplitter.Width               = 5;
                gridSplitter.HorizontalAlignment = HorizontalAlignment.Stretch;
                gridSplitter.VerticalAlignment   = VerticalAlignment.Stretch;
            }
            else
            {
                RowDefinitions.Add(new RowDefinition()
                {
                    Height = new GridLength(1.0, GridUnitType.Star)
                });
                RowDefinitions.Add(new RowDefinition()
                {
                    Height = new GridLength(5)
                });
                RowDefinitions.Add(new RowDefinition()
                {
                    Height = new GridLength(50)
                });
                ColumnDefinitions.Add(new ColumnDefinition());
                SetRow(gridSplitter, 1);
                SetColumn(gridSplitter, 0);
                gridSplitter.ResizeDirection     = GridResizeDirection.Rows;
                gridSplitter.Height              = 5;
                gridSplitter.HorizontalAlignment = HorizontalAlignment.Stretch;
                gridSplitter.VerticalAlignment   = VerticalAlignment.Stretch;
            }

            if (FirstChild != null)
            {
                SetRow(FirstChild, 0);
                SetColumn(FirstChild, 0);
                SetRowSpan(FirstChild, 1);
                SetColumnSpan(FirstChild, 1);
                Children.Add(FirstChild);
            }

            Children.Add(gridSplitter);

            if (SecondChild != null)
            {
                if (Orientation == Orientation.Horizontal)
                {
                    SetRow(SecondChild, 0);
                    SetColumn(SecondChild, 2);
                }
                else
                {
                    SetRow(SecondChild, 2);
                    SetColumn(SecondChild, 0);
                }

                SetRowSpan(SecondChild, 1);
                SetColumnSpan(SecondChild, 1);
                Children.Add(SecondChild);
            }
        }
Пример #20
0
        void UpdateRowColDefinitions()
        {
            var root = _model.Root;

            if (root == null)
            {
                return;
            }
            var manager = root.Manager;

            if (manager == null)
            {
                return;
            }

            FixChildrenDockLengths();

            #region Setup GridRows/Cols
            RowDefinitions.Clear();
            ColumnDefinitions.Clear();
            if (Orientation == Orientation.Horizontal)
            {
                int iColumn = 0;
                int iChild  = 0;
                for (int iChildModel = 0; iChildModel < _model.Children.Count; iChildModel++, iColumn++, iChild++)
                {
                    var childModel = _model.Children[iChildModel] as ILayoutPositionableElement;
                    ColumnDefinitions.Add(new ColumnDefinition()
                    {
                        Width    = childModel.IsVisible ? childModel.DockWidth : new GridLength(0.0, GridUnitType.Pixel),
                        MinWidth = childModel.IsVisible ? childModel.DockMinWidth : 0.0
                    });
                    Grid.SetColumn(InternalChildren[iChild], iColumn);

                    //append column for splitter
                    if (iChild < InternalChildren.Count - 1)
                    {
                        iChild++;
                        iColumn++;

                        ColumnDefinitions.Add(new ColumnDefinition()
                        {
                            Width = new GridLength(manager.GridSplitterWidth)
                        });
                        Grid.SetColumn(InternalChildren[iChild], iColumn);
                        bool nextChildModelVisibleExist = false;
                        if (childModel.IsVisible && !childModel.IsDockWidthFixed)
                        {
                            for (int i = iChildModel + 1; i < _model.Children.Count; i++)
                            {
                                var nextChildModel = _model.Children[i] as ILayoutPositionableElement;
                                if (nextChildModel.IsVisible && nextChildModel.DockWidth != GridLength.Auto && !nextChildModel.IsDockWidthFixed)
                                {
                                    nextChildModelVisibleExist = true;
                                    break;
                                }
                            }
                        }
                        InternalChildren[iChild].Visibility = nextChildModelVisibleExist ? Visibility.Visible : Visibility.Collapsed;
                    }
                }
            }
            else             //if (_model.Orientation == Orientation.Vertical)
            {
                int iRow   = 0;
                int iChild = 0;
                for (int iChildModel = 0; iChildModel < _model.Children.Count; iChildModel++, iRow++, iChild++)
                {
                    var childModel = _model.Children[iChildModel] as ILayoutPositionableElement;
                    RowDefinitions.Add(new RowDefinition()
                    {
                        Height    = childModel.IsVisible ? childModel.DockHeight : new GridLength(0.0, GridUnitType.Pixel),
                        MinHeight = childModel.IsVisible ? childModel.DockMinHeight : 0.0
                    });
                    Grid.SetRow(InternalChildren[iChild], iRow);

                    //append row for splitter (if necessary)
                    if (iChild < InternalChildren.Count - 1)
                    {
                        iChild++;
                        iRow++;

                        RowDefinitions.Add(new RowDefinition()
                        {
                            Height = new GridLength(manager.GridSplitterHeight)
                        });
                        Grid.SetRow(InternalChildren[iChild], iRow);
                        bool nextChildModelVisibleExist = false;
                        if (childModel.IsVisible && !childModel.IsDockHeightFixed)
                        {
                            for (int i = iChildModel + 1; i < _model.Children.Count; i++)
                            {
                                var nextChildModel = _model.Children[i] as ILayoutPositionableElement;
                                if (nextChildModel.IsVisible && nextChildModel.DockHeight != GridLength.Auto && !nextChildModel.IsDockHeightFixed)
                                {
                                    nextChildModelVisibleExist = true;
                                    break;
                                }
                            }
                        }
                        InternalChildren[iChild].Visibility = nextChildModelVisibleExist ? Visibility.Visible : Visibility.Collapsed;
                    }
                }
            }

            #endregion
        }
Пример #21
0
        private void RepopulateChildren(ObservableCollection <ObservableCollection <CellContent> > data)
        {
            //Debug.WriteLine("RepopulateChildren called.");

            bool origRecursiveUpdates = PreventRecursiveUpdates;

            PreventRecursiveUpdates = true;

            Children.Clear();
            RowDefinitions.Clear();
            ColumnDefinitions.Clear();

            var contextMenu = ParentWindow.Resources["ColumnContextMenu"] as ContextMenu;

            //var rect = new Rectangle { Fill = Brushes.Gray };
            //Grid.SetColumnSpan(rect, 10000);
            //Children.Add(rect);

            if (data.Count < 1)
            {
                return;
            }

            RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            var columnCounter = 0;

            foreach (var header in data[0])
            {
                ColumnDefinitions.Add(new ColumnDefinition {
                });

                var columnText = NewTextBox();
                columnText.Background = new BrushConverter().ConvertFromString("#777") as Brush;
                columnText.Tag        = new TablePosition {
                    Column = columnCounter, Row = 0
                };
                columnText.ContextMenu = contextMenu;

                var binding = new Binding("Text")
                {
                    Source = header
                };
                columnText.SetBinding(TextBox.TextProperty, binding);

                Grid.SetColumn(columnText, columnCounter);
                Children.Add(columnText);

                columnCounter++;
            }


            if (data.Count > 50)
            {
                mmApp.Model.Window.ShowStatusProgress("Binding table data...");
            }

            var rowCount = 1;

            foreach (var row in data.Skip(1))
            {
                RowDefinitions.Add(new RowDefinition {
                    Height = GridLength.Auto
                });
                columnCounter = 0;

                foreach (var column in row)
                {
                    var columnText = NewTextBox();
                    columnText.Tag = new TablePosition {
                        Column = columnCounter, Row = rowCount
                    };

                    var binding = new Binding("Text")
                    {
                        Source = column, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, Mode = BindingMode.TwoWay
                    };
                    columnText.SetBinding(TextBox.TextProperty, binding);

                    //columnText.Text = column.Text;

                    columnText.ContextMenu = contextMenu;
                    Grid.SetColumn(columnText, columnCounter);
                    Grid.SetRow(columnText, rowCount);

                    Children.Add(columnText);

                    columnCounter++;
                }
                rowCount++;
                if (rowCount % 8 == 0)
                {
                    PreventRecursiveUpdates = false;
                    WindowUtilities.DoEvents();
                    PreventRecursiveUpdates = true;
                }
            }

            var lastText = Children.OfType <TextBox>().LastOrDefault();

            if (lastText != null)
            {
                lastText.PreviewKeyDown += (s, e) =>
                {
                    if (e.Key == Key.Tab)
                    {
                        if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
                        {
                            return;
                        }

                        var newRow = new ObservableCollection <CellContent>();
                        foreach (var header in TableSource[0])
                        {
                            newRow.Add(new CellContent(string.Empty));
                        }

                        var textBox = s as TextBox;
                        var pos     = textBox.Tag as TablePosition;

                        TableSource.Add(newRow);

                        SelectColumn(pos.Row + 1, 0);
                    }
                };
            }

            PreventRecursiveUpdates = origRecursiveUpdates;
            if (!PreventRecursiveUpdates)
            {
                InvalidateVisual();
            }
        }
        private void RepopulateColumns()
        {
            Children.Clear();
            ColumnDefinitions.Clear();
            if (Columns == null)
            {
                return;
            }

            var columnCounter   = -1;
            var starColumnFound = false;

            foreach (var column in Columns)
            {
                columnCounter++;

                var gridColumn = new ColumnDefinition();
                gridColumn.SetBinding(ColumnDefinition.WidthProperty, new Binding("ActualWidth")
                {
                    Source = column, Mode = BindingMode.OneWay, Converter = new LengthToGridLengthConverter()
                });
                ColumnDefinitions.Add(new ColumnPanelColumnDefinition(gridColumn));
                if (column.Width.GridUnitType == GridUnitType.Star)
                {
                    starColumnFound = true;
                }

                if (column.ItemTemplate != null)
                {
                    var content = column.ItemTemplate.LoadContent() as UIElement;
                    if (content == null)
                    {
                        continue;
                    }
                    Children.Add(content);
                    SetColumn(content, columnCounter);
                }
                else if (column.ColumnControl != ListColumnControls.Auto || (!column.BindingPath.StartsWith("Number") && !column.BindingPath.StartsWith("Image") && !column.BindingPath.StartsWith("Logo")))
                {
                    var content = GetContentGridForColumn(column);

                    switch (column.ColumnControl)
                    {
                    case ListColumnControls.Auto:
                    case ListColumnControls.Text:
                        TextBlock text = null;
                        TextBox   tb   = null;
                        if (column.EditMode != ListRowEditMode.ReadWriteAll)
                        {
                            text = new TextBlock {
                                VerticalAlignment = VerticalAlignment.Center
                            };
                            SetEventCommands(text, column.ReadOnlyControlEventCommands);
                            SetHorizontalAlignment(text, column.CellContentAlignment);
                            text.SetBinding(TextBlock.TextProperty, new Binding(column.BindingPath));
                            if (!string.IsNullOrEmpty(column.ToolTipBindingPath))
                            {
                                text.SetBinding(ToolTipProperty, new Binding(column.ToolTipBindingPath));
                            }
                            else if (!string.IsNullOrEmpty(column.ToolTip))
                            {
                                text.ToolTip = column.ToolTip;
                            }
                            if (EditMode == ListRowEditMode.Manual && IsManualEditEnabled)
                            {
                                text.Visibility = Visibility.Collapsed;
                            }
                            if (column.CellForeground != null)
                            {
                                text.Foreground = column.CellForeground;
                            }
                            else if (!string.IsNullOrEmpty(column.CellForegroundBindingPath))
                            {
                                text.SetBinding(TextBlock.ForegroundProperty, new Binding(column.CellForegroundBindingPath));
                            }
                            content.Children.Add(text);
                        }
                        if (column.EditMode != ListRowEditMode.ReadOnly)
                        {
                            tb = new TextBox {
                                VerticalAlignment = VerticalAlignment.Stretch, HorizontalAlignment = HorizontalAlignment.Stretch, VerticalContentAlignment = VerticalAlignment.Center
                            };
                            SetEventCommands(tb, column.WriteControlEventCommands);
                            SetHorizontalContentAlignment(tb, column.CellContentAlignment, HorizontalAlignment.Stretch);
                            tb.SetBinding(TextBox.TextProperty, new Binding(string.IsNullOrEmpty(column.EditControlBindingPath) ? column.BindingPath : column.EditControlBindingPath)
                            {
                                UpdateSourceTrigger = column.EditControlUpdateSourceTrigger, StringFormat = column.EditControlStringFormat
                            });
                            if (!string.IsNullOrEmpty(column.ToolTipBindingPath))
                            {
                                tb.SetBinding(ToolTipProperty, new Binding(column.ToolTipBindingPath));
                            }
                            else if (!string.IsNullOrEmpty(column.ToolTip))
                            {
                                tb.ToolTip = column.ToolTip;
                            }
                            if (EditMode == ListRowEditMode.Manual && IsManualEditEnabled)
                            {
                                tb.Visibility = Visibility.Visible;
                            }
                            else if (column.EditMode == ListRowEditMode.ReadWriteAll)
                            {
                                tb.Visibility = Visibility.Visible;
                            }
                            else
                            {
                                tb.Visibility = Visibility.Collapsed;
                            }
                            if (column.EditTextBoxStyle != null)
                            {
                                tb.Style = column.EditTextBoxStyle;
                            }
                            else
                            {
                                tb.Padding         = new Thickness(0);
                                tb.BorderThickness = new Thickness(0);
                            }
                            if (column.CellForeground != null)
                            {
                                tb.Foreground = column.CellForeground;
                            }
                            else if (!string.IsNullOrEmpty(column.CellForegroundBindingPath))
                            {
                                tb.SetBinding(Control.ForegroundProperty, new Binding(column.CellForegroundBindingPath));
                            }
                            content.Children.Add(tb);
                        }
                        if (column.EditMode == ListRowEditMode.Manual)
                        {
                            EditModeChanged += (s, e) =>
                            {
                                if (text != null)
                                {
                                    text.Visibility = IsManualEditEnabled ? Visibility.Collapsed : Visibility.Visible;
                                }
                                if (tb != null)
                                {
                                    tb.Visibility = IsManualEditEnabled ? Visibility.Visible : Visibility.Collapsed;
                                }
                            }
                        }
                        ;
                        break;

                    case ListColumnControls.Checkmark:
                        var check = new CheckBox {
                            VerticalAlignment = VerticalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Right, Content = string.Empty, IsEnabled = false
                        };
                        SetEventCommands(check, column.ReadOnlyControlEventCommands);
                        check.SetBinding(ToggleButton.IsCheckedProperty, new Binding(string.IsNullOrEmpty(column.EditControlBindingPath) ? column.BindingPath : column.EditControlBindingPath)
                        {
                            UpdateSourceTrigger = column.EditControlUpdateSourceTrigger, StringFormat = column.EditControlStringFormat
                        });
                        if (!string.IsNullOrEmpty(column.ToolTipBindingPath))
                        {
                            check.SetBinding(ToolTipProperty, new Binding(column.ToolTipBindingPath));
                        }
                        else if (!string.IsNullOrEmpty(column.ToolTip))
                        {
                            check.ToolTip = column.ToolTip;
                        }
                        SetHorizontalAlignment(check, column.CellContentAlignment, HorizontalAlignment.Center);
                        if (column.EditCheckmarkStyle != null)
                        {
                            check.Style = column.EditCheckmarkStyle;
                        }
                        if (column.CellForeground != null)
                        {
                            check.Foreground = column.CellForeground;
                        }
                        else if (!string.IsNullOrEmpty(column.CellForegroundBindingPath))
                        {
                            check.SetBinding(Control.ForegroundProperty, new Binding(column.CellForegroundBindingPath));
                        }
                        content.Children.Add(check);
                        if (column.EditMode == ListRowEditMode.Manual)
                        {
                            var col2 = column;
                            EditModeChanged += (s, e) =>
                            {
                                if (check != null)
                                {
                                    check.IsEnabled = IsManualEditEnabled;
                                    SetEventCommands(check, check.IsEnabled ? col2.ReadOnlyControlEventCommands : col2.WriteControlEventCommands);
                                }
                            };
                        }
                        break;

                    case ListColumnControls.TextList:
                        TextBlock text2 = null;
                        ComboBox  combo = null;
                        if (column.EditMode != ListRowEditMode.ReadWriteAll)
                        {
                            text2 = new TextBlock {
                                VerticalAlignment = VerticalAlignment.Center
                            };
                            SetEventCommands(text2, column.ReadOnlyControlEventCommands);
                            SetHorizontalAlignment(text2, column.CellContentAlignment);
                            if (!string.IsNullOrEmpty(column.ToolTipBindingPath))
                            {
                                text2.SetBinding(ToolTipProperty, new Binding(column.ToolTipBindingPath));
                            }
                            else if (!string.IsNullOrEmpty(column.ToolTip))
                            {
                                text2.ToolTip = column.ToolTip;
                            }
                            text2.SetBinding(TextBlock.TextProperty, new Binding(column.BindingPath));
                            if (EditMode == ListRowEditMode.Manual && IsManualEditEnabled)
                            {
                                text2.Visibility = Visibility.Collapsed;
                            }
                            if (column.CellForeground != null)
                            {
                                text2.Foreground = column.CellForeground;
                            }
                            else if (!string.IsNullOrEmpty(column.CellForegroundBindingPath))
                            {
                                text2.SetBinding(TextBlock.ForegroundProperty, new Binding(column.CellForegroundBindingPath));
                            }
                            content.Children.Add(text2);
                        }
                        if (column.EditMode != ListRowEditMode.ReadOnly)
                        {
                            combo = new ComboBox {
                                VerticalAlignment = VerticalAlignment.Stretch, HorizontalAlignment = HorizontalAlignment.Stretch, VerticalContentAlignment = VerticalAlignment.Center
                            };
                            SetEventCommands(combo, column.WriteControlEventCommands);
                            SetHorizontalContentAlignment(combo, column.CellContentAlignment, HorizontalAlignment.Stretch);
                            if (!string.IsNullOrEmpty(column.BindingPath) || !string.IsNullOrEmpty(column.EditControlBindingPath))
                            {
                                combo.SetBinding(Selector.SelectedValueProperty, new Binding(string.IsNullOrEmpty(column.EditControlBindingPath) ? column.BindingPath : column.EditControlBindingPath)
                                {
                                    UpdateSourceTrigger = column.EditControlUpdateSourceTrigger, StringFormat = column.EditControlStringFormat
                                });
                            }
                            combo.SetBinding(ItemsControl.ItemsSourceProperty, new Binding(column.TextListItemsSourceBindingPath));
                            combo.SelectedValuePath = column.TextListSelectedValuePath;
                            combo.DisplayMemberPath = column.TextListDisplayMemberPath;
                            if (!string.IsNullOrEmpty(column.ToolTipBindingPath))
                            {
                                combo.SetBinding(ToolTipProperty, new Binding(column.ToolTipBindingPath));
                            }
                            else if (!string.IsNullOrEmpty(column.ToolTip))
                            {
                                combo.ToolTip = column.ToolTip;
                            }
                            if (EditMode == ListRowEditMode.Manual && IsManualEditEnabled)
                            {
                                combo.Visibility = Visibility.Visible;
                            }
                            else
                            {
                                combo.Visibility = Visibility.Collapsed;
                            }
                            if (column.EditTextListStyle != null)
                            {
                                combo.Style = column.EditTextListStyle;
                            }
                            else
                            {
                                combo.Padding         = new Thickness(0);
                                combo.BorderThickness = new Thickness(0);
                            }
                            if (column.CellForeground != null)
                            {
                                combo.Foreground = column.CellForeground;
                            }
                            else if (!string.IsNullOrEmpty(column.CellForegroundBindingPath))
                            {
                                combo.SetBinding(Control.ForegroundProperty, new Binding(column.CellForegroundBindingPath));
                            }
                            content.Children.Add(combo);
                        }
                        if (column.EditMode == ListRowEditMode.Manual)
                        {
                            EditModeChanged += (s, e) =>
                            {
                                if (text2 != null)
                                {
                                    text2.Visibility = IsManualEditEnabled ? Visibility.Collapsed : Visibility.Visible;
                                }
                                if (combo != null)
                                {
                                    combo.Visibility = IsManualEditEnabled ? Visibility.Visible : Visibility.Collapsed;
                                }
                            }
                        }
                        ;
                        break;

                    case ListColumnControls.Image:
                        var image = new Image {
                            VerticalAlignment = VerticalAlignment.Stretch, HorizontalAlignment = HorizontalAlignment.Stretch, Stretch = Stretch.UniformToFill
                        };
                        SetEventCommands(image, column.ReadOnlyControlEventCommands);
                        image.SetBinding(Image.SourceProperty, new Binding(column.BindingPath)
                        {
                            Mode = BindingMode.OneWay
                        });
                        if (!string.IsNullOrEmpty(column.ToolTipBindingPath))
                        {
                            image.SetBinding(ToolTipProperty, new Binding(column.ToolTipBindingPath));
                        }
                        else if (!string.IsNullOrEmpty(column.ToolTip))
                        {
                            image.ToolTip = column.ToolTip;
                        }
                        content.Children.Add(image);
                        break;
                    }

                    Children.Add(content);
                    SetColumn(content, columnCounter);
                }
                else if (column.BindingPath.StartsWith("Number"))
                {
                    var content = GetContentGridForColumn(column);
                    var text    = new TextBlock {
                        VerticalAlignment = VerticalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Right, TextAlignment = TextAlignment.Right
                    };
                    SetEventCommands(text, column.ReadOnlyControlEventCommands);
                    text.SetBinding(TextBlock.TextProperty, new Binding(column.BindingPath));
                    if (!string.IsNullOrEmpty(column.ToolTipBindingPath))
                    {
                        text.SetBinding(ToolTipProperty, new Binding(column.ToolTipBindingPath));
                    }
                    else if (!string.IsNullOrEmpty(column.ToolTip))
                    {
                        text.ToolTip = column.ToolTip;
                    }
                    if (column.CellForeground != null)
                    {
                        text.Foreground = column.CellForeground;
                    }
                    else if (!string.IsNullOrEmpty(column.CellForegroundBindingPath))
                    {
                        text.SetBinding(TextBlock.ForegroundProperty, new Binding(column.CellForegroundBindingPath));
                    }
                    content.Children.Add(text);
                    Children.Add(content);
                    SetColumn(content, columnCounter);
                }
                else if (column.BindingPath.StartsWith("Image") || column.BindingPath.StartsWith("Logo"))
                {
                    var content = GetContentGridForColumn(column);
                    var image   = new Rectangle
                    {
                        VerticalAlignment   = VerticalAlignment.Stretch,
                        HorizontalAlignment = HorizontalAlignment.Stretch,
                        Height = double.NaN,
                        Width  = double.NaN
                    };
                    SetEventCommands(image, column.ReadOnlyControlEventCommands);
                    image.SetBinding(Shape.FillProperty, new Binding(column.BindingPath));
                    if (!string.IsNullOrEmpty(column.ToolTipBindingPath))
                    {
                        image.SetBinding(ToolTipProperty, new Binding(column.ToolTipBindingPath));
                    }
                    else if (!string.IsNullOrEmpty(column.ToolTip))
                    {
                        image.ToolTip = column.ToolTip;
                    }
                    content.Children.Add(image);
                    Children.Add(content);
                    SetColumn(content, columnCounter);
                }
            }

            if (starColumnFound)
            {
                var presenter = ElementHelper.FindVisualTreeParent <ContentPresenter>(this);
                if (presenter != null)
                {
                    presenter.HorizontalAlignment = HorizontalAlignment.Stretch;
                }
            }
        }