protected override void OnTemplateApplied(TemplateAppliedEventArgs e) { TextView = e.NameScope.Find <TextView>("textView"); LogicalChildren.Add(TextView); disposables.Add(TextDocumentProperty.Changed.Subscribe(args => { if (args.NewValue != null) { // Todo unsubscribe these events. TextDocument.Changing += (sender, ee) => { TextDocument?.UndoStack.PushOptional(new RestoreCaretAndSelectionUndoAction(this)); if (BeforeTextChangedCommand != null) { BeforeTextChangedCommand.Execute(null); } }; TextDocument.Changed += (sender, ee) => { InvalidateVisual(); LineHeight = TextView.CharSize.Height; textChangedDelayTimer.Stop(); textChangedDelayTimer.Start(); }; } })); }
/// <summary> /// Creates a new code completion window. /// </summary> public CompletionWindow(TextArea textArea) : base(textArea, (textArea.Parent.VisualRoot as Window).PlatformImpl.CreatePopup()) { CompletionList = new CompletionList(); // keep height automatic CloseAutomatically = true; MaxHeight = 225; Width = 175; Content = CompletionList; // prevent user from resizing window to 0x0 MinHeight = 15; MinWidth = 30; _toolTipContent = new ContentControl(); _toolTipContent.Classes.Add("ToolTip"); _toolTip = new PopupWithCustomPosition { StaysOpen = false, PlacementTarget = this, PlacementMode = PlacementMode.Right, Child = _toolTipContent, }; LogicalChildren.Add(_toolTip); //_toolTip.Closed += (o, e) => ((Popup)o).Child = null; AttachEvents(); }
/// <summary> /// Called when new containers are materialized for the <see cref="ItemsControl"/> by its /// <see cref="ItemContainerGenerator"/>. /// </summary> /// <param name="e">The details of the containers.</param> protected virtual void OnContainersMaterialized(ItemContainerEventArgs e) { foreach (var container in e.Containers) { // If the item is its own container, then it will be added to the logical tree when // it was added to the Items collection. if (container.ContainerControl != null && container.ContainerControl != container.Item) { if (ItemContainerGenerator.ContainerType == null) { var containerControl = container.ContainerControl as ContentPresenter; if (containerControl != null) { ((ISetLogicalParent)containerControl).SetParent(this); containerControl.UpdateChild(); if (containerControl.Child != null) { LogicalChildren.Add(containerControl.Child); } } } else { LogicalChildren.Add(container.ContainerControl); } } } }
public ColumnHeader(Column column) { Column = column; TextBlock = new TextBlock { Margin = new Thickness(1.0), Text = Column.FieldName }; LogicalChildren.Add(TextBlock); VisualChildren.Add(TextBlock); }
/// <summary> /// Updates the <see cref="Child"/> control based on the control's <see cref="Content"/>. /// </summary> /// <remarks> /// Usually the <see cref="Child"/> control is created automatically when /// <see cref="ApplyTemplate"/> is called; however for this to happen, the control needs to /// be attached to a logical tree (if the control is not attached to the logical tree, it /// is reasonable to expect that the DataTemplates needed for the child are not yet /// available). This method forces the <see cref="Child"/> control's creation at any point, /// and is particularly useful in unit tests. /// </remarks> public void UpdateChild() { var content = Content; var oldChild = Child; var newChild = CreateChild(); // Remove the old child if we're not recycling it. if (oldChild != null && newChild != oldChild) { VisualChildren.Remove(oldChild); } // Set the DataContext if the data isn't a control. if (!(content is IControl)) { DataContext = content; } else { ClearValue(DataContextProperty); } // Update the Child. if (newChild == null) { Child = null; } else if (newChild != oldChild) { ((ISetInheritanceParent)newChild).SetParent(this); Child = newChild; if (oldChild?.Parent == this) { LogicalChildren.Remove(oldChild); } if (newChild.Parent == null) { var templatedLogicalParent = TemplatedParent as ILogical; if (templatedLogicalParent != null) { ((ISetLogicalParent)newChild).SetParent(templatedLogicalParent); } else { LogicalChildren.Add(newChild); } } VisualChildren.Add(newChild); } _createdChild = true; }
private Ellipse CreateMarker() { var marker = new Ellipse(); marker[~Shape.FillProperty] = this[~MarkerBrushProperty]; marker[~ToolTip.TipProperty] = this[~MessageProperty]; VisualChildren.Add(marker); LogicalChildren.Add(marker); return(marker); }
private Control CreateMarker() { var marker = new Image(); marker.PointerPressed += (o, e) => { e.Handled = true; MarkerPointerDown?.Invoke(o, e); }; marker[~Image.SourceProperty] = this[~MarkerImageProperty]; marker[~ToolTip.TipProperty] = this[~MessageProperty]; VisualChildren.Add(marker); LogicalChildren.Add(marker); return(marker); }
private void InitializeComponent() { _viewer = new ScrollViewer() { Padding = new Thickness(5), HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled, VerticalScrollBarVisibility = ScrollBarVisibility.Auto, }; VisualChildren.Add(_viewer); LogicalChildren.Add(_viewer); }
/// <summary> /// Called when the <see cref="Child"/> property changes. /// </summary> /// <param name="e">The event args.</param> private void ChildChanged(AvaloniaPropertyChangedEventArgs e) { LogicalChildren.Clear(); ((ISetLogicalParent)e.OldValue)?.SetParent(null); if (e.NewValue != null) { ((ISetLogicalParent)e.NewValue).SetParent(this); LogicalChildren.Add((ILogical)e.NewValue); } }
private void HeaderChanged(AvaloniaPropertyChangedEventArgs e) { if (e.OldValue is ILogical oldChild) { LogicalChildren.Remove(oldChild); } if (e.NewValue is ILogical newChild) { LogicalChildren.Add(newChild); } }
/// <summary> /// Creates the <see cref="Panel"/>. /// </summary> private void CreatePanel() { Panel = ItemsPanel.Build(); Panel.SetValue(TemplatedParentProperty, TemplatedParent); LogicalChildren.Clear(); VisualChildren.Clear(); LogicalChildren.Add(Panel); VisualChildren.Add(Panel); _createdPanel = true; var task = MoveToPage(-1, SelectedIndex); }
private Control CreateMarker() { #pragma warning disable CS0618 // Type or member is obsolete var marker = new DrawingPresenter(); #pragma warning restore CS0618 // Type or member is obsolete marker.PointerPressed += (o, e) => { e.Handled = true; MarkerPointerDown?.Invoke(o, e); }; #pragma warning disable CS0618 // Type or member is obsolete marker[~DrawingPresenter.DrawingProperty] = this[~MarkerImageProperty]; #pragma warning restore CS0618 // Type or member is obsolete marker[~ToolTip.TipProperty] = this[~MessageProperty]; VisualChildren.Add(marker); LogicalChildren.Add(marker); return(marker); }
/// <summary> /// Called when the <see cref="Icon"/> property changes. /// </summary> /// <param name="e">The property change event.</param> private void IconChanged(AvaloniaPropertyChangedEventArgs e) { var oldValue = e.OldValue as ILogical; var newValue = e.NewValue as ILogical; if (oldValue != null) { LogicalChildren.Remove(oldValue); } if (newValue != null) { LogicalChildren.Add(newValue); } }
/// <summary> /// Generates a new BreadcrumbItem out of the specified item. /// </summary> /// <param name="item">The item for which to create a new BreadcrumbItem.</param> /// <returns>Item, if item is a BreadcrumbItem, otherwhise a newly created BreadcrumbItem.</returns> public BreadcrumbItem ContainerFromItem(object item) { BreadcrumbItem result = item as BreadcrumbItem; if (result == null) { result = CreateItem(item); if (result != null) { LogicalChildren.Add(result); result.ApplyTemplate(); } } return(result); }
private void ButtonChanged(AvaloniaPropertyChangedEventArgs e) { var oldButton = (Button)e.OldValue; var newButton = (Button)e.NewValue; if (oldButton != null) { LogicalChildren.Remove(oldButton); VisualChildren.Remove(oldButton); } if (newButton != null) { LogicalChildren.Add(newButton); VisualChildren.Add(newButton); } }
public void RecreateContent() { LogicalChildren.Clear(); VisualChildren.Clear(); GridBorderLines.Clear(); for (int i = 0; i < 4; i++) { var line = new Line() { Stroke = GridControl.BorderBrush, StrokeThickness = GridControl.BorderThickness }; GridBorderLines.Add(line); LogicalChildren.Add(line); VisualChildren.Add(line); } ColumnHeaders.Clear(); ColumnHeaderLines.Clear(); for (int i = 0; i < GridControl.Columns.Count; i++) { GridControl.Columns[i].Index = i; var columnHeader = GridControl.Columns[i].CreateColumnHeader(); ColumnHeaders.Add(columnHeader); LogicalChildren.Add(columnHeader); VisualChildren.Add(columnHeader); var line = new Line() { Stroke = GridControl.VerticalLinesBrush, StrokeThickness = GridControl.VerticalLinesThickness }; ColumnHeaderLines.Add(line); LogicalChildren.Add(line); VisualChildren.Add(line); } HorizontalHeaderLine = new Line() { Stroke = GridControl.HorizontalLinesBrush, StrokeThickness = GridControl.HorizontalLinesThickness }; LogicalChildren.Add(HorizontalHeaderLine); VisualChildren.Add(HorizontalHeaderLine); CellsPanel.RecreateCells(); LogicalChildren.Add(CellsPanel); VisualChildren.Add(CellsPanel); }
protected override void OnDataContextChanged() { if (Content as ILogical != null) { LogicalChildren.Remove(Content as ILogical); } if (DataContext != null) { Content = ViewLocator.Build(DataContext); } if (Content as ILogical != null) { LogicalChildren.Add(Content as ILogical); } }
protected override void OnTemplateApplied(TemplateAppliedEventArgs e) { marginContainer = e.NameScope.Find <StackPanel>("marginsPanel"); textSurface = e.NameScope.Find <Rectangle>("textSurface"); contentPresenter = e.NameScope.Find <ContentControl>("contentPresenter"); foreach (var margin in Margins) { if (margin is ILogical) { LogicalChildren.Add(margin as ILogical); } InstallMargin(margin); } collectionChangedDisposable = Observable.FromEventPattern <NotifyCollectionChangedEventArgs>(Margins, "CollectionChanged").Subscribe(o => { switch (o.EventArgs.Action) { case NotifyCollectionChangedAction.Add: foreach (var newItem in o.EventArgs.NewItems) { if (newItem as ILogical != null) { LogicalChildren.Add(newItem as ILogical); InstallMargin(newItem as Control); } } break; case NotifyCollectionChangedAction.Remove: foreach (var oldItem in o.EventArgs.OldItems) { if (oldItem as ILogical != null) { LogicalChildren.Remove(oldItem as ILogical); UninstallMargin(oldItem as Control); } } break; } }); }
/// <summary> /// Called when the <see cref="Child"/> property changes. /// </summary> /// <param name="e">The event args.</param> private void ChildChanged(AvaloniaPropertyChangedEventArgs e) { var oldChild = (Control)e.OldValue; var newChild = (Control)e.NewValue; if (oldChild != null) { ((ISetLogicalParent)oldChild).SetParent(null); LogicalChildren.Clear(); VisualChildren.Remove(oldChild); } if (newChild != null) { ((ISetLogicalParent)newChild).SetParent(this); VisualChildren.Add(newChild); LogicalChildren.Add(newChild); } }
protected override void OnDataContextEndUpdate() { base.OnDataContextEndUpdate(); if (Content as ILogical != null) { LogicalChildren.Remove(Content as ILogical); } if (DataContext != null) { Content = ViewLocator.Build(DataContext); } if (Content as ILogical != null) { LogicalChildren.Add(Content as ILogical); } }
/// <summary> /// Creates the <see cref="Panel"/> when <see cref="ApplyTemplate"/> is called for the first /// time. /// </summary> private void CreatePanel() { Panel = ItemsPanel.Build(); Panel.SetValue(TemplatedParentProperty, TemplatedParent); LogicalChildren.Clear(); VisualChildren.Clear(); LogicalChildren.Add(Panel); VisualChildren.Add(Panel); _createdPanel = true; if (!IsHosted && _itemsSubscription == null && Items is INotifyCollectionChanged incc) { _itemsSubscription = incc.WeakSubscribe(ItemsCollectionChanged); } PanelCreated(Panel); }
private void ThumbChanged(AvaloniaPropertyChangedEventArgs e) { var oldThumb = (Thumb)e.OldValue; var newThumb = (Thumb)e.NewValue; if (oldThumb != null) { oldThumb.DragDelta -= ThumbDragged; LogicalChildren.Remove(oldThumb); VisualChildren.Remove(oldThumb); } if (newThumb != null) { newThumb.DragDelta += ThumbDragged; LogicalChildren.Add(newThumb); VisualChildren.Add(newThumb); } }
private void ThumbChanged(PerspexPropertyChangedEventArgs e) { var oldThumb = (Thumb)e.OldValue; var newThumb = (Thumb)e.NewValue; if (oldThumb != null) { oldThumb.DragDelta -= ThumbDragged; } LogicalChildren.Clear(); VisualChildren.Clear(); if (newThumb != null) { newThumb.DragDelta += ThumbDragged; LogicalChildren.Add(newThumb); VisualChildren.Add(newThumb); } }
/// <summary> /// Creates the <see cref="Panel"/> when <see cref="ApplyTemplate"/> is called for the first /// time. /// </summary> protected virtual void CreatePanel() { Panel = ItemsPanel.Build(); Panel.SetValue(TemplatedParentProperty, TemplatedParent); LogicalChildren.Clear(); VisualChildren.Clear(); LogicalChildren.Add(Panel); VisualChildren.Add(Panel); _createdPanel = true; INotifyCollectionChanged incc = Items as INotifyCollectionChanged; if (incc != null) { incc.CollectionChanged += ItemsCollectionChanged; } ItemsChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); }
/// <summary> /// Creates the <see cref="Panel"/> when <see cref="ApplyTemplate"/> is called for the first /// time. /// </summary> private void CreatePanel() { Panel = ItemsPanel.Build(); Panel.SetValue(TemplatedParentProperty, TemplatedParent); if (!Panel.IsSet(KeyboardNavigation.DirectionalNavigationProperty)) { KeyboardNavigation.SetDirectionalNavigation( (InputElement)Panel, KeyboardNavigationMode.Contained); } LogicalChildren.Clear(); VisualChildren.Clear(); LogicalChildren.Add(Panel); VisualChildren.Add(Panel); KeyboardNavigation.SetTabNavigation( (InputElement)Panel, KeyboardNavigation.GetTabNavigation(this)); _createdPanel = true; CreateItemsAndListenForChanges(Items); }
protected override Size ArrangeOverride(Size finalSize) { int firstRow = Cells.GetInitialRow(); foreach (var cell in Cells.GetVisibleCells()) { double width = AccumulatedColumnWidths[cell.Column.Index + 1] - AccumulatedColumnWidths[cell.Column.Index] - GridControl.VerticalLinesThickness; cell.Arrange(new Rect(AccumulatedColumnWidths[cell.Column.Index], AccumulatedRowHeights[cell.Row - firstRow], width, cell.DesiredSize.Height)); } UpdateGridLines(); ScrollBar.Arrange(new Rect(finalSize.Width - ScrollBar.Width, 0.0, ScrollBar.Width, finalSize.Height)); return(finalSize); void UpdateGridLines() { int lastAccumulatedColumnWidthsIndex = AccumulatedColumnWidths.Count - 1; while (ColumnLines.Count > lastAccumulatedColumnWidthsIndex) { var columnLine = ColumnLines[ColumnLines.Count - 1]; ColumnLines.Remove(columnLine); LogicalChildren.Remove(columnLine); VisualChildren.Remove(columnLine); } while (lastAccumulatedColumnWidthsIndex > ColumnLines.Count) { Line columnLine = new Line(); columnLine.Stroke = GridControl.VerticalLinesBrush; columnLine.StrokeThickness = GridControl.VerticalLinesThickness; ColumnLines.Add(columnLine); LogicalChildren.Add(columnLine); VisualChildren.Add(columnLine); } int lastAccumulatedRowHeightsIndex = AccumulatedRowHeights.Count(rh => !Double.IsNaN(rh)) - 1; while (RowLines.Count > lastAccumulatedRowHeightsIndex) { var rowLine = RowLines[RowLines.Count - 1]; RowLines.Remove(rowLine); LogicalChildren.Remove(rowLine); VisualChildren.Remove(rowLine); } while (lastAccumulatedRowHeightsIndex > RowLines.Count) { Line rowLine = new Line(); rowLine.Stroke = GridControl.HorizontalLinesBrush; rowLine.StrokeThickness = GridControl.HorizontalLinesThickness; RowLines.Add(rowLine); LogicalChildren.Add(rowLine); VisualChildren.Add(rowLine); } for (int i = 0; i < RowLines.Count; i++) { double y = AccumulatedRowHeights[i + 1] - GridControl.HorizontalLinesThickness / 2.0; RowLines[i].StartPoint = new Point(0.0, y); RowLines[i].EndPoint = new Point(AccumulatedColumnWidths[lastAccumulatedColumnWidthsIndex], y); } for (int i = 0; i < ColumnLines.Count; i++) { double x = AccumulatedColumnWidths[i + 1] - GridControl.VerticalLinesThickness / 2.0; ColumnLines[i].StartPoint = new Point(x, 0.0); ColumnLines[i].EndPoint = new Point(x, AccumulatedRowHeights[lastAccumulatedRowHeightsIndex]); } foreach (var line in RowLines.Concat(ColumnLines)) { line.InvalidateMeasure(); line.Measure(Size.Infinity); } } }
/// <summary> /// Updates the <see cref="Child"/> control based on the control's <see cref="Content"/>. /// </summary> /// <remarks> /// Usually the <see cref="Child"/> control is created automatically when /// <see cref="ApplyTemplate"/> is called; however for this to happen, the control needs to /// be attached to a logical tree (if the control is not attached to the logical tree, it /// is reasonable to expect that the DataTemplates needed for the child are not yet /// available). This method forces the <see cref="Child"/> control's creation at any point, /// and is particularly useful in unit tests. /// </remarks> public void UpdateChild() { var content = Content; var oldChild = Child; var newChild = content as IControl; if (content != null && newChild == null) { // We have content and it isn't a control, so first try to recycle the existing // child control to display the new data by querying if the template that created // the child can recycle items and that it also matches the new data. if (oldChild != null && _dataTemplate != null && _dataTemplate.SupportsRecycling && _dataTemplate.Match(content)) { newChild = oldChild; } else { // We couldn't recycle an existing control so find a data template for the data // and use it to create a control. _dataTemplate = this.FindDataTemplate(content, ContentTemplate) ?? FuncDataTemplate.Default; newChild = _dataTemplate.Build(content); // Try to give the new control its own name scope. var controlResult = newChild as Control; if (controlResult != null) { NameScope.SetNameScope(controlResult, new NameScope()); } } } else { _dataTemplate = null; } // Remove the old child if we're not recycling it. if (oldChild != null && newChild != oldChild) { VisualChildren.Remove(oldChild); } // Set the DataContext if the data isn't a control. if (!(content is IControl)) { DataContext = content; } // Update the Child. if (newChild == null) { Child = null; } else if (newChild != oldChild) { ((ISetInheritanceParent)newChild).SetParent(this); Child = newChild; if (oldChild?.Parent == this) { LogicalChildren.Remove(oldChild); } if (newChild.Parent == null) { var templatedLogicalParent = TemplatedParent as ILogical; if (templatedLogicalParent != null) { ((ISetLogicalParent)newChild).SetParent(templatedLogicalParent); } else { LogicalChildren.Add(newChild); } } VisualChildren.Add(newChild); } _createdChild = true; }