/// <summary> /// This method is invoked when the Items property changes. /// </summary> protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Remove: ParentTreeView?.ClearObsoleteItems(e.OldItems); break; case NotifyCollectionChangedAction.Reset: case NotifyCollectionChangedAction.Replace: case NotifyCollectionChangedAction.Add: case NotifyCollectionChangedAction.Move: break; default: throw new NotSupportedException(); } }
/// <summary> /// Raises the <see cref="UIElement.MouseDown"/> event. /// </summary> /// <param name="e"> /// The <see cref="MouseButtonEventArgs"/> instance containing the event data. /// </param> protected override void OnMouseDown(MouseButtonEventArgs e) { if (e == null) { throw new ArgumentNullException(nameof(e)); } base.OnMouseDown(e); if (e.Handled || _header == null || !_header.IsMouseOver) { return; } if (e.ChangedButton == MouseButton.Left || (e.ChangedButton == MouseButton.Right && !IsSelected)) { e.Handled = true; ParentTreeView?.MoveSelection(this); } }
/// <summary> /// Raises the <see cref="UIElement.KeyDown"/> event. /// </summary> /// <param name="e"> /// The <see cref="KeyEventArgs"/> instance containing the event data. /// </param> protected override void OnKeyDown(KeyEventArgs e) { if (e == null) { throw new ArgumentNullException(nameof(e)); } base.OnKeyDown(e); if (e.Handled) { return; } // TODO: Consider FlowDirection for Left/Right. switch (e.Key) { case Key.Left: case Key.Subtract: if (CanExpand && IsEnabled && IsExpanded) { e.Handled = true; IsExpanded = false; } break; case Key.Add: case Key.Right: if (CanExpand && IsEnabled && !IsExpanded) { e.Handled = true; IsExpanded = true; } break; } if (!e.Handled) { ParentTreeView?.HandleKeyDown(this, e); } }
/// <summary> /// Determine if the current node is an L, T, or Root junction. /// Note: This code is essentially duplicated from the client behavior. /// </summary> /// <returns>A character defining the type of junction.</returns> protected char CalcJunction() { if (Parent is TreeView && GetPreviousSibling() == null) { // Get index of node and add 1 to the last value string strIndex = GetNodeIndex(); int iIndexPos = strIndex.LastIndexOf('.'); int iIndexVal = Convert.ToInt32(strIndex.Substring(iIndexPos + 1)) + 1; strIndex = strIndex.Substring(0, iIndexPos + 1) + iIndexVal.ToString(); // if the node exists, we're an "F" node. if (ParentTreeView.GetNodeFromIndex(strIndex) != null) { return('F'); } else { return('R'); } } else { TreeNodeCollection col; if (Parent is TreeView) { col = ((TreeView)Parent).Nodes; } else { col = ((TreeNode)Parent).Nodes; } int i = col.IndexOf(this) + 1; if (i < col.Count) { return('T'); } return('L'); } }
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) { //if (e.Property.Name == "IsEditing") //{ // if ((bool)e.NewValue == false) // { // StopEditing(); // } // else // { // ParentTreeView.IsEditingManager.SetEditedObject(this); // } //} if (ParentTreeView != null && e.Property.Name == "IsSelected") { if (ParentTreeView.SelectedItems.Contains(DataContext) != IsSelected) { ParentTreeView.SelectFromProperty(this, IsSelected); } } base.OnPropertyChanged(e); }
private bool StopEditing() { return(ParentTreeView.StopEditing()); }
protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); if (!e.Handled) { Key key = e.Key; switch (key) { case Key.Left: if (IsExpanded) { IsExpanded = false; } e.Handled = true; break; case Key.Right: IsExpanded = true; e.Handled = true; break; case Key.Up: ParentTreeView.SelectPreviousFromKey(); e.Handled = true; break; case Key.Down: ParentTreeView.SelectNextFromKey(); e.Handled = true; break; case Key.Add: if (IsExpandableOnInput && !IsExpanded) { IsExpanded = true; } e.Handled = true; break; case Key.Subtract: if (IsExpandableOnInput && IsExpanded) { IsExpanded = false; } e.Handled = true; break; case Key.F2: e.Handled = StartEditing(); break; case Key.Escape: case Key.Return: StopEditing(); e.Handled = true; break; case Key.Space: ParentTreeView.SelectCurrentBySpace(); e.Handled = true; break; case Key.Home: ParentTreeView.SelectFirst(); e.Handled = true; break; case Key.End: ParentTreeView.SelectLast(); e.Handled = true; break; } } }
protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); if (!e.Handled) { Key key = e.Key; switch (key) { case Key.Left: if (IsExpanded) { IsExpanded = false; } else { ParentTreeView.Selection.SelectParentFromKey(); } e.Handled = true; break; case Key.Right: if (CanExpand) { if (!IsExpanded) { IsExpanded = true; } else { ParentTreeView.Selection.SelectNextFromKey(); } } e.Handled = true; break; case Key.Up: ParentTreeView.Selection.SelectPreviousFromKey(); e.Handled = true; break; case Key.Down: ParentTreeView.Selection.SelectNextFromKey(); e.Handled = true; break; case Key.Home: ParentTreeView.Selection.SelectFirstFromKey(); e.Handled = true; break; case Key.End: ParentTreeView.Selection.SelectLastFromKey(); e.Handled = true; break; case Key.PageUp: ParentTreeView.Selection.SelectPageUpFromKey(); e.Handled = true; break; case Key.PageDown: ParentTreeView.Selection.SelectPageDownFromKey(); e.Handled = true; break; case Key.A: if (e.KeyboardDevice.Modifiers == ModifierKeys.Control) { ParentTreeView.Selection.SelectAllFromKey(); e.Handled = true; } break; case Key.Add: if (CanExpandOnInput && !IsExpanded) { IsExpanded = true; } e.Handled = true; break; case Key.Multiply: if (CanExpandOnInput && !IsExpanded) { IsExpanded = true; ParentTreeView.RecursiveExpand(this); } e.Handled = true; break; case Key.Subtract: if (CanExpandOnInput && IsExpanded) { IsExpanded = false; } e.Handled = true; break; case Key.F2: if (ParentTreeView.AllowEditItems && ContentTemplateEdit != null && IsFocused && IsEditable) { IsEditing = true; e.Handled = true; } break; case Key.Escape: StopEditing(); e.Handled = true; break; case Key.Return: FocusHelper.Focus(this, true); IsEditing = false; e.Handled = true; break; case Key.Space: ParentTreeView.Selection.SelectCurrentBySpace(); e.Handled = true; break; } } }
protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); if (e.Handled) { return; } switch (e.Key) { case Key.Add: if (CanExpandOnInput && !IsExpanded) { SetCurrentValue(IsExpandedProperty, true); e.Handled = true; } break; case Key.Subtract: if (CanExpandOnInput && IsExpanded) { SetCurrentValue(IsExpandedProperty, false); e.Handled = true; } break; case Key.Left: case Key.Right: if (LogicalLeft(e.Key)) { if (CanExpandOnInput && IsExpanded) { if (IsFocused) { SetCurrentValue(IsExpandedProperty, false); } else { Focus(); } } else { ParentTreeView.SelectParentFromKey(); } } else { if (CanExpandOnInput) { if (!IsExpanded) { SetCurrentValue(IsExpandedProperty, true); } else { ParentTreeView.SelectNextFromKey(); } } } e.Handled = true; break; case Key.Down: ParentTreeView.SelectNextFromKey(); e.Handled = true; break; case Key.Up: ParentTreeView.SelectPreviousFromKey(); e.Handled = true; break; case Key.F2: e.Handled = StartEditing(); break; case Key.Escape: case Key.Return: StopEditing(); e.Handled = true; break; case Key.Space: ParentTreeView.SelectCurrentBySpace(); e.Handled = true; break; case Key.Home: ParentTreeView.SelectFirst(); e.Handled = true; break; case Key.End: ParentTreeView.SelectLast(); e.Handled = true; break; } }
protected override Task OnParametersSetAsync() { ParentTreeView.AddTreeNodeBinding(this); return(base.OnParametersSetAsync()); }
void TreeViewItemExtended_Expanded(object sender, RoutedEventArgs e) { ParentTreeView.InvokeContainerExpanded(sender, e); }
/// <summary> /// Invoked whenever an unhandled <see cref="E:System.Windows.UIElement.GotFocus" /> event reaches this element in its route. /// </summary> /// <param name="e">The <see cref="T:System.Windows.RoutedEventArgs" /> that contains the event data.</param> protected override void OnGotFocus(RoutedEventArgs e) { ParentTreeView.Select(this, true); base.OnGotFocus(e); }
/// <summary> /// Invoked whenever an unhandled <see cref="UIElement.GotFocus"/> event reaches this /// element in its route. /// </summary> /// <param name="e"> /// The <see cref="RoutedEventArgs"/> that contains the event data. /// </param> protected override void OnGotFocus(RoutedEventArgs e) { ParentTreeView?.HandleGotFocus(this); base.OnGotFocus(e); }
/// <summary> /// Invoked when the <see cref="ItemsControl.Items"/> property changes. /// </summary> /// <param name="e">Information about the change.</param> protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e) { base.OnItemsChanged(e); ParentTreeView?.HandleItemsChanged(this, e); }
/// <summary> /// TODO: This is a little stinky... /// </summary> internal void ChildSelected(TreeViewItem child) { ParentTreeViewItem?.ChildSelected(child); ParentTreeView?.ChildSelected(child); }
void Node_Collapsing(object sender, EventArgs e) { ParentTreeView.HandleCollapsing(Node); }
protected override void OnSelected(RoutedEventArgs e) { base.OnSelected(e); RequestBringIntoView += TreeViewItemEx_RequestBringIntoView; if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) { ItemsControl items = ParentItemsControl; bool hasMultipleSelected = false; foreach (object item in items.Items) { TreeViewItemEx ex = items.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItemEx; if (ex != null && ex.IsMultipleSelected) { hasMultipleSelected = true; break; } } if (hasMultipleSelected) { ParentTreeView.HandlingMultipleSelected = true; bool select = false; foreach (object item in items.Items) { TreeViewItemEx ex = items.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItemEx; if (ex == null) { continue; } if (select) { if (ReferenceEquals(ex, this) || ex.IsMultipleSelected) { ex.IsMultipleSelected = true; break; } ex.IsMultipleSelected = true; } else { if (ReferenceEquals(ex, this) || ex.IsMultipleSelected) { ex.IsMultipleSelected = true; select = true; } } } } } else { ParentTreeView?.ClearMultipleSelection(); IsMultipleSelected = true; if (ParentTreeView != null) { ParentTreeView.HandlingMultipleSelected = true; } } }