From c5c38984b02238230a9bc03a9b777e29bae6c023 Mon Sep 17 00:00:00 2001 From: "J. Smith" Date: Thu, 10 Aug 2017 13:10:21 -0500 Subject: [PATCH 1/6] Modify RichTextBoxFormatBarManager.cs to fix #1165 Addresses #1165 In my testing, this appears to solve this problem and does not interfere with or alter normal behavior. I tried to keep code formatting consistent with original code. --- .../RichTextBoxFormatBarManager.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs index 5b8a9752..53a6c0f0 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs @@ -210,13 +210,25 @@ namespace Xceed.Wpf.Toolkit //top if( top < 0 ) { - top = mousePosition.Y + 10; + top = Math.Max( mousePosition.Y + 10, 5 ); + } + + // bottom + if ( top + adorningEditor.ActualHeight > _richTextBox.ActualHeight - 20 ) + { + top = _richTextBox.ActualHeight - adorningEditor.ActualHeight - 20; + } + + // left boundary + if ( left < 0 ) + { + left = 5; } //right boundary if( left + adorningEditor.ActualWidth > _richTextBox.ActualWidth - 20 ) { - left = left - ( adorningEditor.ActualWidth - ( _richTextBox.ActualWidth - left ) ); + left = _richTextBox.ActualWidth - adorningEditor.ActualWidth - 20; } _adorner.SetOffsets( left, top ); From 7802d00c127ca28327b07a1d452aba313c6facd8 Mon Sep 17 00:00:00 2001 From: John Stewien Date: Thu, 17 Aug 2017 16:23:36 +0930 Subject: [PATCH 2/6] AvalonDock fixed crash when shrinking auto-sized panel --- .../Controls/LayoutGridControl.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutGridControl.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutGridControl.cs index c4fc3bfa..94d4f831 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutGridControl.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutGridControl.cs @@ -386,6 +386,10 @@ namespace Xceed.Wpf.AvalonDock.Controls { prevChildModel.DockWidth = new GridLength(prevChildModel.DockWidth.Value * (prevChildActualSize.Width + delta) / prevChildActualSize.Width, GridUnitType.Star); } + else if (prevChildModel.DockWidth.IsAuto) + { + prevChildModel.DockWidth = new GridLength(prevChildActualSize.Width + delta, GridUnitType.Pixel); + } else { prevChildModel.DockWidth = new GridLength(prevChildModel.DockWidth.Value + delta, GridUnitType.Pixel); @@ -395,6 +399,10 @@ namespace Xceed.Wpf.AvalonDock.Controls { nextChildModel.DockWidth = new GridLength(nextChildModel.DockWidth.Value * (nextChildActualSize.Width - delta) / nextChildActualSize.Width, GridUnitType.Star); } + else if (nextChildModel.DockWidth.IsAuto) + { + nextChildModel.DockWidth = new GridLength(nextChildActualSize.Width - delta, GridUnitType.Pixel); + } else { nextChildModel.DockWidth = new GridLength(nextChildModel.DockWidth.Value - delta, GridUnitType.Pixel); @@ -406,6 +414,10 @@ namespace Xceed.Wpf.AvalonDock.Controls { prevChildModel.DockHeight = new GridLength(prevChildModel.DockHeight.Value * (prevChildActualSize.Height + delta) / prevChildActualSize.Height, GridUnitType.Star); } + else if (prevChildModel.DockHeight.IsAuto) + { + prevChildModel.DockHeight = new GridLength(prevChildActualSize.Height + delta, GridUnitType.Pixel); + } else { prevChildModel.DockHeight = new GridLength(prevChildModel.DockHeight.Value + delta, GridUnitType.Pixel); @@ -415,6 +427,10 @@ namespace Xceed.Wpf.AvalonDock.Controls { nextChildModel.DockHeight = new GridLength(nextChildModel.DockHeight.Value * (nextChildActualSize.Height - delta) / nextChildActualSize.Height, GridUnitType.Star); } + else if (nextChildModel.DockHeight.IsAuto) + { + nextChildModel.DockHeight = new GridLength(nextChildActualSize.Height - delta, GridUnitType.Pixel); + } else { nextChildModel.DockHeight = new GridLength(nextChildModel.DockHeight.Value - delta, GridUnitType.Pixel); From 0f3f8be154bd2fdd23cd1a3d9ebabe9fc27369e5 Mon Sep 17 00:00:00 2001 From: John Stewien Date: Thu, 17 Aug 2017 16:34:08 +0930 Subject: [PATCH 3/6] AvalonDock Fixed some null reference exceptions --- .../Controls/LayoutAnchorablePaneControl.cs | 5 ++++- .../Src/Xceed.Wpf.AvalonDock/Controls/LayoutItem.cs | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorablePaneControl.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorablePaneControl.cs index 62ae0ccf..8a1d8106 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorablePaneControl.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorablePaneControl.cs @@ -62,7 +62,10 @@ namespace Xceed.Wpf.AvalonDock.Controls protected override void OnGotKeyboardFocus(System.Windows.Input.KeyboardFocusChangedEventArgs e) { - _model.SelectedContent.IsActive = true; + if (_model?.SelectedContent != null) + { + _model.SelectedContent.IsActive = true; + } base.OnGotKeyboardFocus(e); } diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutItem.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutItem.cs index c2aa7836..e23ec50b 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutItem.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutItem.cs @@ -204,9 +204,9 @@ namespace Xceed.Wpf.AvalonDock.Controls _view = new ContentPresenter(); _view.SetBinding(ContentPresenter.ContentProperty, new Binding("Content") { Source = LayoutElement }); - _view.SetBinding( ContentPresenter.ContentTemplateProperty, new Binding( "LayoutItemTemplate" ) { Source = LayoutElement.Root.Manager } ); - _view.SetBinding( ContentPresenter.ContentTemplateSelectorProperty, new Binding( "LayoutItemTemplateSelector" ) { Source = LayoutElement.Root.Manager } ); - LayoutElement.Root.Manager.InternalAddLogicalChild( _view ); + _view.SetBinding(ContentPresenter.ContentTemplateProperty, new Binding("LayoutItemTemplate") { Source = LayoutElement?.Root?.Manager}); + _view.SetBinding(ContentPresenter.ContentTemplateSelectorProperty, new Binding("LayoutItemTemplateSelector") { Source = LayoutElement?.Root?.Manager }); + LayoutElement?.Root?.Manager.InternalAddLogicalChild(_view); } return _view; From 7488d6d3679829b67a7fac394340d629f667ab15 Mon Sep 17 00:00:00 2001 From: John Stewien Date: Thu, 17 Aug 2017 17:07:21 +0930 Subject: [PATCH 4/6] AvalonDock fixed tabs undocking when changing tabs to a different sized tab, related to AutoSize setting. --- .../Controls/LayoutAnchorableTabItem.cs | 26 ++++++++++++++++--- .../Layout/LayoutContent.cs | 1 + 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableTabItem.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableTabItem.cs index ee6695d7..856260cf 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableTabItem.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableTabItem.cs @@ -116,8 +116,11 @@ namespace Xceed.Wpf.AvalonDock.Controls #endregion - bool _isMouseDown = false; - static LayoutAnchorableTabItem _draggingItem = null; + private bool _isMouseDown = false; + private static LayoutAnchorableTabItem _draggingItem = null; + // There's an issue with panes resizing when selecting another tab, causing a + // mouse leave event to make the tab undock. This fixes that. + private static bool _cancelNextMouseLeave = false; internal static bool IsDraggingItem() { @@ -132,6 +135,10 @@ namespace Xceed.Wpf.AvalonDock.Controls { _draggingItem = null; } + internal static void CancelNextMouseLeave() + { + _cancelNextMouseLeave = true; + } protected override void OnMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e) { @@ -150,6 +157,11 @@ namespace Xceed.Wpf.AvalonDock.Controls _isMouseDown = false; _draggingItem = null; } + else + { + _cancelNextMouseLeave = false; + } + } protected override void OnMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs e) @@ -167,10 +179,18 @@ namespace Xceed.Wpf.AvalonDock.Controls if (_isMouseDown && e.LeftButton == MouseButtonState.Pressed) { - _draggingItem = this; + if (!_cancelNextMouseLeave) + { + _draggingItem = this; + } + else + { + _draggingItem = null; + } } _isMouseDown = false; + _cancelNextMouseLeave = false; } protected override void OnMouseEnter(MouseEventArgs e) diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutContent.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutContent.cs index d7b3eaba..b65cf913 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutContent.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutContent.cs @@ -127,6 +127,7 @@ namespace Xceed.Wpf.AvalonDock.Layout parentSelector.SelectedContentIndex = _isSelected ? parentSelector.IndexOf(this) : -1; OnIsSelectedChanged(oldValue, value); RaisePropertyChanged("IsSelected"); + Controls.LayoutAnchorableTabItem.CancelNextMouseLeave(); } } } From 23a6e2f5dbc8d9ceb6b842e0c66eb7b90960d8f5 Mon Sep 17 00:00:00 2001 From: John Stewien Date: Thu, 17 Aug 2017 16:06:24 +0930 Subject: [PATCH 5/6] AvalonDock Made ContentID Bindable in LayoutContent.cs --- .../Layout/LayoutContent.cs | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutContent.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutContent.cs index d7b3eaba..67030492 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutContent.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutContent.cs @@ -84,25 +84,31 @@ namespace Xceed.Wpf.AvalonDock.Layout #region ContentId - private string _contentId = null; + //Added to make ContentId bindable + public static DependencyProperty ContentIdProperty = + DependencyProperty.Register(nameof(ContentId), + typeof(string), typeof(LayoutContent), new FrameworkPropertyMetadata(null, (s, e) => + { + (s as LayoutContent)?.RaisePropertyChanged(nameof(ContentId)); + })); + public string ContentId { - get + get { - if (_contentId == null) - { + if (GetValue(ContentIdProperty) == null) + { var contentAsControl = _content as FrameworkElement; if (contentAsControl != null && !string.IsNullOrWhiteSpace(contentAsControl.Name)) return contentAsControl.Name; } - return _contentId; + return (string)GetValue(ContentIdProperty); } set { - if (_contentId != value) + if (!String.Equals(GetValue(ContentIdProperty) as string, value)) { - _contentId = value; - RaisePropertyChanged("ContentId"); + SetValue(ContentIdProperty, value); } } } From 722d4d4880e874620565343f13036fd99a020cb8 Mon Sep 17 00:00:00 2001 From: aydjay Date: Wed, 13 Sep 2017 11:07:21 +0100 Subject: [PATCH 6/6] Fixed null reference when databound mask is nulled --- .../MaskedTextBox/Implementation/MaskedTextBox.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/MaskedTextBox/Implementation/MaskedTextBox.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/MaskedTextBox/Implementation/MaskedTextBox.cs index 4d68eedb..43e9d9d7 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/MaskedTextBox/Implementation/MaskedTextBox.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/MaskedTextBox/Implementation/MaskedTextBox.cs @@ -1441,7 +1441,7 @@ namespace Xceed.Wpf.Toolkit internal override bool GetIsEditTextEmpty() { - return ( this.MaskedTextProvider.AssignedEditPositionCount == 0 ); + return MaskedTextProvider != null && (MaskedTextProvider.AssignedEditPositionCount == 0 ); } #endregion INTERNAL PROPERTIES