diff --git a/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/DockingUtilitiesTest.cs b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/DockingUtilitiesTest.cs
new file mode 100644
index 00000000..8fd92dc7
--- /dev/null
+++ b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/DockingUtilitiesTest.cs
@@ -0,0 +1,111 @@
+namespace Xceed.Wpf.AvalonDock.Test
+{
+ using System;
+ using System.Windows.Controls;
+
+ using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+ using Xceed.Wpf.AvalonDock.Layout;
+
+ [TestClass]
+ public sealed class DockingUtilitiesTest
+ {
+ [TestMethod]
+ public void CalculatedDockMinWidthHeightTest()
+ {
+ double defaultDockMinHeight = 25;
+ double defaultDockMinWidth = 25;
+
+ const double documentPaneDockMinHeight = 200;
+ const double documentPaneDockMinWidth = 400;
+ LayoutDocumentPane layoutDocumentPane = new LayoutDocumentPane { DockMinHeight = documentPaneDockMinHeight, DockMinWidth = documentPaneDockMinWidth };
+ layoutDocumentPane.InsertChildAt( 0, new LayoutDocument { ContentId = "Document" } );
+
+ LayoutDocumentPaneGroup layoutDocumentPaneGroup = new LayoutDocumentPaneGroup();
+ layoutDocumentPaneGroup.InsertChildAt( 0, layoutDocumentPane );
+
+ const double anchorablePaneDockMinHeight = 80;
+ const double anchorablePaneDockMinWidth = 160;
+ LayoutAnchorablePane layoutAnchorablePane = new LayoutAnchorablePane { DockMinHeight = anchorablePaneDockMinHeight, DockMinWidth = anchorablePaneDockMinWidth };
+ layoutAnchorablePane.InsertChildAt( 0, new LayoutAnchorable { ContentId = "Anchorable" } );
+
+ LayoutAnchorablePaneGroup layoutAnchorablePaneGroup = new LayoutAnchorablePaneGroup();
+ layoutAnchorablePaneGroup.InsertChildAt( 0, layoutAnchorablePane );
+
+ LayoutPanel layoutPanel = new LayoutPanel();
+ layoutPanel.InsertChildAt( 0, layoutDocumentPaneGroup );
+ layoutPanel.InsertChildAt( 1, layoutAnchorablePaneGroup );
+
+ Assert.AreEqual( defaultDockMinWidth, layoutPanel.DockMinWidth );
+ Assert.AreEqual( defaultDockMinHeight, layoutPanel.DockMinHeight );
+ Assert.AreEqual( documentPaneDockMinWidth + anchorablePaneDockMinWidth, layoutPanel.CalculatedDockMinWidth() );
+ Assert.AreEqual( Math.Max(documentPaneDockMinHeight, anchorablePaneDockMinHeight), layoutPanel.CalculatedDockMinHeight() );
+
+ Assert.AreEqual( documentPaneDockMinWidth, layoutDocumentPane.DockMinWidth );
+ Assert.AreEqual( documentPaneDockMinHeight, layoutDocumentPane.DockMinHeight );
+ Assert.AreEqual( layoutDocumentPane.DockMinWidth, layoutDocumentPane.CalculatedDockMinWidth() );
+ Assert.AreEqual( layoutDocumentPane.DockMinHeight, layoutDocumentPane.CalculatedDockMinHeight() );
+
+ Assert.AreEqual( defaultDockMinWidth, layoutDocumentPaneGroup.DockMinWidth );
+ Assert.AreEqual( defaultDockMinWidth, layoutDocumentPaneGroup.DockMinHeight );
+ Assert.AreEqual( documentPaneDockMinWidth, layoutDocumentPaneGroup.CalculatedDockMinWidth() );
+ Assert.AreEqual( documentPaneDockMinHeight, layoutDocumentPaneGroup.CalculatedDockMinHeight() );
+
+ Assert.AreEqual( anchorablePaneDockMinWidth, layoutAnchorablePane.DockMinWidth );
+ Assert.AreEqual( anchorablePaneDockMinHeight, layoutAnchorablePane.DockMinHeight );
+ Assert.AreEqual( layoutAnchorablePane.DockMinWidth, layoutAnchorablePane.CalculatedDockMinWidth() );
+ Assert.AreEqual( layoutAnchorablePane.DockMinHeight, layoutAnchorablePane.CalculatedDockMinHeight() );
+
+ Assert.AreEqual( defaultDockMinWidth, layoutAnchorablePaneGroup.DockMinWidth );
+ Assert.AreEqual( defaultDockMinWidth, layoutAnchorablePaneGroup.DockMinHeight );
+ Assert.AreEqual( anchorablePaneDockMinWidth, layoutAnchorablePaneGroup.CalculatedDockMinWidth() );
+ Assert.AreEqual( anchorablePaneDockMinHeight, layoutAnchorablePaneGroup.CalculatedDockMinHeight() );
+
+ layoutPanel.RemoveChild( layoutDocumentPaneGroup );
+ Assert.AreEqual( anchorablePaneDockMinWidth, layoutPanel.CalculatedDockMinWidth() );
+ Assert.AreEqual( anchorablePaneDockMinHeight, layoutPanel.CalculatedDockMinHeight() );
+ }
+
+ [TestMethod]
+ public void UpdateDocMinWidthHeightTest()
+ {
+ double documentPaneDockMinHeight = 100;
+ double documentPaneDockMinWidth = 101;
+ LayoutDocumentPane layoutDocumentPane = new LayoutDocumentPane { DockMinHeight = documentPaneDockMinHeight, DockMinWidth = documentPaneDockMinWidth };
+ layoutDocumentPane.InsertChildAt( 0, new LayoutDocument { ContentId = "Document" } );
+
+ LayoutDocumentPaneGroup layoutDocumentPaneGroup = new LayoutDocumentPaneGroup();
+ layoutDocumentPaneGroup.InsertChildAt( 0, layoutDocumentPane );
+
+ double anchorablePane1DockMinHeight = 150;
+ double anchorablePane1DockMinWidth = 151;
+ LayoutAnchorablePane layoutAnchorablePane1 = new LayoutAnchorablePane { DockMinHeight = anchorablePane1DockMinHeight, DockMinWidth = anchorablePane1DockMinWidth };
+ layoutAnchorablePane1.InsertChildAt( 0, new LayoutAnchorable { ContentId = "Anchorable1" } );
+
+ double anchorablePane2DockMinHeight = 200;
+ double anchorablePane2DockMinWidth = 201;
+ LayoutAnchorablePane layoutAnchorablePane2 = new LayoutAnchorablePane { DockMinHeight = anchorablePane2DockMinHeight, DockMinWidth = anchorablePane2DockMinWidth };
+ layoutAnchorablePane2.InsertChildAt( 0, new LayoutAnchorable { ContentId = "Anchorable2" } );
+
+ LayoutAnchorablePaneGroup layoutAnchorablePaneGroup = new LayoutAnchorablePaneGroup { Orientation = Orientation.Horizontal };
+ layoutAnchorablePaneGroup.InsertChildAt( 0, layoutAnchorablePane1 );
+ layoutAnchorablePaneGroup.InsertChildAt( 0, layoutAnchorablePane2 );
+
+ LayoutPanel layoutPanel = new LayoutPanel { Orientation = Orientation.Vertical };
+ layoutPanel.InsertChildAt( 0, layoutDocumentPaneGroup );
+ layoutPanel.InsertChildAt( 1, layoutAnchorablePaneGroup );
+
+ Assert.AreEqual( anchorablePane2DockMinWidth + anchorablePane1DockMinWidth, layoutAnchorablePaneGroup.CalculatedDockMinWidth() );
+ Assert.AreEqual( Math.Max( anchorablePane2DockMinHeight, anchorablePane1DockMinHeight ), layoutAnchorablePaneGroup.CalculatedDockMinHeight() );
+
+ Assert.AreEqual( documentPaneDockMinWidth, layoutDocumentPaneGroup.CalculatedDockMinWidth() );
+ Assert.AreEqual( documentPaneDockMinHeight, layoutDocumentPaneGroup.CalculatedDockMinHeight() );
+
+ Assert.AreEqual(
+ Math.Max( anchorablePane1DockMinWidth + anchorablePane2DockMinWidth, documentPaneDockMinWidth ),
+ layoutPanel.CalculatedDockMinWidth() );
+
+ Assert.AreEqual( documentPaneDockMinHeight + anchorablePane2DockMinHeight, layoutPanel.CalculatedDockMinHeight() );
+ }
+ }
+}
diff --git a/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/LayoutAnchorableTest.cs b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/LayoutAnchorableTest.cs
new file mode 100644
index 00000000..e6e3b34e
--- /dev/null
+++ b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/LayoutAnchorableTest.cs
@@ -0,0 +1,65 @@
+using System.Linq;
+using System.Reflection;
+using System.Windows;
+using System.Windows.Data;
+
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+using Xceed.Wpf.AvalonDock.Controls;
+using Xceed.Wpf.AvalonDock.Converters;
+using Xceed.Wpf.AvalonDock.Layout;
+
+namespace Xceed.Wpf.AvalonDock.Test
+{
+ [TestClass]
+ public sealed class LayoutAnchorableTest
+ {
+ [TestMethod]
+ public void ClearBindingOfHiddenWindowTest()
+ {
+ LayoutAnchorable layoutAnchorable = new LayoutAnchorable
+ {
+ FloatingWidth = 50,
+ FloatingHeight = 100,
+ ContentId = "Test"
+ };
+
+ LayoutAnchorablePane layoutAnchorablePane = new LayoutAnchorablePane( layoutAnchorable );
+ LayoutAnchorablePaneGroup layoutAnchorablePaneGroup = new LayoutAnchorablePaneGroup( layoutAnchorablePane );
+ LayoutAnchorableFloatingWindow layoutFloatingWindow = new LayoutAnchorableFloatingWindow
+ {
+ RootPanel = layoutAnchorablePaneGroup
+ };
+
+ var ctor = typeof( LayoutAnchorableFloatingWindowControl )
+ .GetTypeInfo()
+ .GetConstructors( BindingFlags.NonPublic | BindingFlags.Instance )
+ .First( x => x.GetParameters().Length == 1 );
+
+ LayoutAnchorableFloatingWindowControl floatingWindowControl = ctor.Invoke( new object[] {layoutFloatingWindow} ) as LayoutAnchorableFloatingWindowControl;
+ floatingWindowControl.SetBinding(
+ UIElement.VisibilityProperty,
+ new Binding( "IsVisible" )
+ {
+ Source = floatingWindowControl.Model,
+ Converter = new BoolToVisibilityConverter(),
+ Mode = BindingMode.OneWay,
+ ConverterParameter = Visibility.Hidden
+ } );
+
+ BindingExpression visibilityBinding = floatingWindowControl.GetBindingExpression( UIElement.VisibilityProperty );
+ Assert.IsNotNull( visibilityBinding );
+
+ layoutAnchorable.Show();
+ layoutAnchorable.Hide();
+
+ visibilityBinding = floatingWindowControl.GetBindingExpression( UIElement.VisibilityProperty );
+ Assert.IsNotNull( visibilityBinding );
+
+ floatingWindowControl.Hide();
+
+ visibilityBinding = floatingWindowControl.GetBindingExpression( UIElement.VisibilityProperty );
+ Assert.IsNull( visibilityBinding );
+ }
+ }
+}
diff --git a/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/Xceed.Wpf.AvalonDock.Test.csproj b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/Xceed.Wpf.AvalonDock.Test.csproj
index 82a80bae..3a7d19b1 100644
--- a/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/Xceed.Wpf.AvalonDock.Test.csproj
+++ b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/Xceed.Wpf.AvalonDock.Test.csproj
@@ -52,10 +52,13 @@
+
+
+
TestApp.xaml
@@ -102,4 +105,4 @@
-
+
\ No newline at end of file
diff --git a/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableFloatingWindowControl.cs b/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableFloatingWindowControl.cs
index 3ffacc74..0c363a57 100644
--- a/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableFloatingWindowControl.cs
+++ b/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableFloatingWindowControl.cs
@@ -201,6 +201,8 @@ protected override void OnClosed( EventArgs e )
BindingOperations.ClearBinding(_model, VisibilityProperty);
_model.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler( _model_PropertyChanged );
+
+ Activated -= LayoutAnchorableFloatingWindowControl_Activated;
}
protected override void OnClosing( System.ComponentModel.CancelEventArgs e )
@@ -329,7 +331,7 @@ private void SetVisibilityBinding()
{
SetBinding(
VisibilityProperty,
- new Binding("IsVisible")
+ new Binding( "IsVisible" )
{
Source = _model,
Converter = new BoolToVisibilityConverter(),
diff --git a/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs b/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs
index 7b72a153..b2bb064c 100644
--- a/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs
+++ b/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs
@@ -310,8 +310,8 @@ internal virtual void UpdateThemeResources( Theme oldTheme = null )
}
}
- var manager = _model.Root.Manager;
- if( manager.Theme != null )
+ var manager = _model.Root?.Manager;
+ if( manager?.Theme != null )
{
if( manager.Theme is DictionaryTheme )
{
diff --git a/source/Components/Xceed.Wpf.AvalonDock/Layout/LayoutAnchorable.cs b/source/Components/Xceed.Wpf.AvalonDock/Layout/LayoutAnchorable.cs
index 5bbe0a1c..9a41987e 100644
--- a/source/Components/Xceed.Wpf.AvalonDock/Layout/LayoutAnchorable.cs
+++ b/source/Components/Xceed.Wpf.AvalonDock/Layout/LayoutAnchorable.cs
@@ -419,7 +419,7 @@ public void Hide( bool cancelable = true )
PreviousContainer = parentAsGroup;
PreviousContainerIndex = parentAsGroup.IndexOfChild( this );
}
- Root.Hidden.Add( this );
+ Root?.Hidden?.Add( this );
RaisePropertyChanged( "IsVisible" );
RaisePropertyChanged( "IsHidden" );
NotifyIsVisibleChanged();