diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Aero/AssemblyVersionInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Aero/AssemblyVersionInfo.cs index 84bce886..d3cc2ce9 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Aero/AssemblyVersionInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Aero/AssemblyVersionInfo.cs @@ -21,7 +21,7 @@ internal static class _XceedVersionInfo { [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] - public const string BaseVersion = "2.9"; + public const string BaseVersion = "3.0"; [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] public const string Version = BaseVersion + ".0.0"; diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Aero/Properties/AssemblyInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Aero/Properties/AssemblyInfo.cs index c9b2ea8d..f8dc5d77 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Aero/Properties/AssemblyInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Aero/Properties/AssemblyInfo.cs @@ -25,12 +25,12 @@ using System; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle( "Xceed Extended WPF Toolkit - AvalonDock Aero Theme" )] +[assembly: AssemblyTitle( "Xceed Toolkit for WPF - AvalonDock Aero Theme" )] [assembly: AssemblyDescription( "This assembly implements the Aero Theme for the AvalonDock layout system." )] [assembly: AssemblyCompany( "Xceed Software Inc." )] -[assembly: AssemblyProduct( "Xceed Extended WPF Toolkit - AvalonDock" )] -[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2015" )] +[assembly: AssemblyProduct( "Xceed Toolkit for WPF - AvalonDock" )] +[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2016" )] diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Metro/AssemblyVersionInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Metro/AssemblyVersionInfo.cs index 84bce886..d3cc2ce9 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Metro/AssemblyVersionInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Metro/AssemblyVersionInfo.cs @@ -21,7 +21,7 @@ internal static class _XceedVersionInfo { [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] - public const string BaseVersion = "2.9"; + public const string BaseVersion = "3.0"; [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] public const string Version = BaseVersion + ".0.0"; diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Metro/Properties/AssemblyInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Metro/Properties/AssemblyInfo.cs index 82239c01..fe8545f1 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Metro/Properties/AssemblyInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.Metro/Properties/AssemblyInfo.cs @@ -25,12 +25,12 @@ using System; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle( "Xceed Extended WPF Toolkit - AvalonDock Metro Theme" )] +[assembly: AssemblyTitle( "Xceed Toolkit for WPF - AvalonDock Metro Theme" )] [assembly: AssemblyDescription( "This assembly implements the Metro Theme for the AvalonDock layout system." )] [assembly: AssemblyCompany( "Xceed Software Inc." )] -[assembly: AssemblyProduct( "Xceed Extended WPF Toolkit - AvalonDock" )] -[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2015" )] +[assembly: AssemblyProduct( "Xceed Toolkit for WPF - AvalonDock" )] +[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2016" )] diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.VS2010/AssemblyVersionInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.VS2010/AssemblyVersionInfo.cs index 84bce886..d3cc2ce9 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.VS2010/AssemblyVersionInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.VS2010/AssemblyVersionInfo.cs @@ -21,7 +21,7 @@ internal static class _XceedVersionInfo { [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] - public const string BaseVersion = "2.9"; + public const string BaseVersion = "3.0"; [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] public const string Version = BaseVersion + ".0.0"; diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.VS2010/Properties/AssemblyInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.VS2010/Properties/AssemblyInfo.cs index d96c1edc..39a96798 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.VS2010/Properties/AssemblyInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock.Themes.VS2010/Properties/AssemblyInfo.cs @@ -25,12 +25,12 @@ using System; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle( "Xceed Extended WPF Toolkit - AvalonDock" )] +[assembly: AssemblyTitle( "Xceed Toolkit for WPF - AvalonDock" )] [assembly: AssemblyDescription( "This assembly implements the VS2010 Theme for the AvalonDock layout system." )] [assembly: AssemblyCompany( "Xceed Software Inc." )] -[assembly: AssemblyProduct( "Xceed Extended WPF Toolkit - AvalonDock" )] -[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2015" )] +[assembly: AssemblyProduct( "Xceed Toolkit for WPF - AvalonDock" )] +[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2016" )] // Setting ComVisible to false makes the types in this assembly not visible diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/AssemblyVersionInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/AssemblyVersionInfo.cs index 84bce886..d3cc2ce9 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/AssemblyVersionInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/AssemblyVersionInfo.cs @@ -21,7 +21,7 @@ internal static class _XceedVersionInfo { [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] - public const string BaseVersion = "2.9"; + public const string BaseVersion = "3.0"; [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] public const string Version = BaseVersion + ".0.0"; diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs index db4db6af..62b89456 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs @@ -42,111 +42,111 @@ namespace Xceed.Wpf.AvalonDock.Controls LayoutFloatingWindowControl.ContentProperty.OverrideMetadata(typeof(LayoutFloatingWindowControl), new FrameworkPropertyMetadata(null, null, new CoerceValueCallback(CoerceContentValue))); AllowsTransparencyProperty.OverrideMetadata(typeof(LayoutFloatingWindowControl), new FrameworkPropertyMetadata(false)); ShowInTaskbarProperty.OverrideMetadata(typeof(LayoutFloatingWindowControl), new FrameworkPropertyMetadata(false)); - } + } - static object CoerceContentValue(DependencyObject sender, object content) + static object CoerceContentValue( DependencyObject sender, object content ) { - return new FloatingWindowContentHost(sender as LayoutFloatingWindowControl) { Content = content as UIElement }; + return new FloatingWindowContentHost( sender as LayoutFloatingWindowControl ) { Content = content as UIElement }; } protected class FloatingWindowContentHost : HwndHost - { - LayoutFloatingWindowControl _owner; - public FloatingWindowContentHost(LayoutFloatingWindowControl owner) { - _owner = owner; - var manager = _owner.Model.Root.Manager; - } + LayoutFloatingWindowControl _owner; + public FloatingWindowContentHost(LayoutFloatingWindowControl owner) + { + _owner = owner; + var manager = _owner.Model.Root.Manager; + } - HwndSource _wpfContentHost = null; - Border _rootPresenter = null; - DockingManager _manager = null; + HwndSource _wpfContentHost = null; + Border _rootPresenter = null; + DockingManager _manager = null; - protected override System.Runtime.InteropServices.HandleRef BuildWindowCore(System.Runtime.InteropServices.HandleRef hwndParent) - { - _wpfContentHost = new HwndSource(new HwndSourceParameters() + protected override System.Runtime.InteropServices.HandleRef BuildWindowCore(System.Runtime.InteropServices.HandleRef hwndParent) { - ParentWindow = hwndParent.Handle, - WindowStyle = Win32Helper.WS_CHILD | Win32Helper.WS_VISIBLE | Win32Helper.WS_CLIPSIBLINGS | Win32Helper.WS_CLIPCHILDREN, - Width = 1, - Height = 1 - }); - - _rootPresenter = new Border() { Child = new AdornerDecorator() { Child = Content }, Focusable = true }; - _rootPresenter.SetBinding(Border.BackgroundProperty, new Binding("Background") { Source = _owner }); - _wpfContentHost.RootVisual = _rootPresenter; - _wpfContentHost.SizeToContent = SizeToContent.Manual; - _manager = _owner.Model.Root.Manager; - _manager.InternalAddLogicalChild(_rootPresenter); - - return new HandleRef(this, _wpfContentHost.Handle); - } + _wpfContentHost = new HwndSource(new HwndSourceParameters() + { + ParentWindow = hwndParent.Handle, + WindowStyle = Win32Helper.WS_CHILD | Win32Helper.WS_VISIBLE | Win32Helper.WS_CLIPSIBLINGS | Win32Helper.WS_CLIPCHILDREN, + Width = 1, + Height = 1 + }); + + _rootPresenter = new Border() { Child = new AdornerDecorator() { Child = Content }, Focusable = true }; + _rootPresenter.SetBinding(Border.BackgroundProperty, new Binding("Background") { Source = _owner }); + _wpfContentHost.RootVisual = _rootPresenter; + _wpfContentHost.SizeToContent = SizeToContent.Manual; + _manager = _owner.Model.Root.Manager; + _manager.InternalAddLogicalChild(_rootPresenter); + + return new HandleRef(this, _wpfContentHost.Handle); + } - protected override void DestroyWindowCore(HandleRef hwnd) - { - _manager.InternalRemoveLogicalChild(_rootPresenter); - if (_wpfContentHost != null) + protected override void DestroyWindowCore(HandleRef hwnd) { - _wpfContentHost.Dispose(); - _wpfContentHost = null; + _manager.InternalRemoveLogicalChild(_rootPresenter); + if (_wpfContentHost != null) + { + _wpfContentHost.Dispose(); + _wpfContentHost = null; + } } - } - public Visual RootVisual - { - get { return _rootPresenter; } - } + public Visual RootVisual + { + get { return _rootPresenter; } + } - protected override Size MeasureOverride(Size constraint) - { - if (Content == null) - return base.MeasureOverride(constraint); + protected override Size MeasureOverride(Size constraint) + { + if (Content == null) + return base.MeasureOverride(constraint); - Content.Measure(constraint); - return Content.DesiredSize; - } + Content.Measure(constraint); + return Content.DesiredSize; + } - #region Content - - /// - /// Content Dependency Property - /// - public static readonly DependencyProperty ContentProperty = - DependencyProperty.Register("Content", typeof(UIElement), typeof(FloatingWindowContentHost), - new FrameworkPropertyMetadata((UIElement)null, - new PropertyChangedCallback(OnContentChanged))); - - /// - /// Gets or sets the Content property. This dependency property - /// indicates .... - /// - public UIElement Content - { - get { return (UIElement)GetValue(ContentProperty); } - set { SetValue(ContentProperty, value); } - } + #region Content + + /// + /// Content Dependency Property + /// + public static readonly DependencyProperty ContentProperty = + DependencyProperty.Register("Content", typeof(UIElement), typeof(FloatingWindowContentHost), + new FrameworkPropertyMetadata((UIElement)null, + new PropertyChangedCallback(OnContentChanged))); + + /// + /// Gets or sets the Content property. This dependency property + /// indicates .... + /// + public UIElement Content + { + get { return (UIElement)GetValue(ContentProperty); } + set { SetValue(ContentProperty, value); } + } - /// - /// Handles changes to the Content property. - /// - private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - ((FloatingWindowContentHost)d).OnContentChanged(e); - } + /// + /// Handles changes to the Content property. + /// + private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + ((FloatingWindowContentHost)d).OnContentChanged(e); + } - /// - /// Provides derived classes an opportunity to handle changes to the Content property. - /// - protected virtual void OnContentChanged(DependencyPropertyChangedEventArgs e) - { - if (_rootPresenter != null) - _rootPresenter.Child = Content; - } + /// + /// Provides derived classes an opportunity to handle changes to the Content property. + /// + protected virtual void OnContentChanged(DependencyPropertyChangedEventArgs e) + { + if (_rootPresenter != null) + _rootPresenter.Child = Content; + } - #endregion - } + #endregion + } ILayoutElement _model; @@ -200,7 +200,10 @@ namespace Xceed.Wpf.AvalonDock.Controls if (Content != null) { var host = Content as FloatingWindowContentHost; - host.Dispose(); + if( host != null ) + { + host.Dispose(); + } if (_hwndSrc != null) { diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/DockingManager.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/DockingManager.cs index 68e139ab..13195377 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/DockingManager.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/DockingManager.cs @@ -1249,6 +1249,14 @@ namespace Xceed.Wpf.AvalonDock } } + public System.Collections.IEnumerator LogicalChildrenPublic + { + get + { + return this.LogicalChildren; + } + } + internal void InternalAddLogicalChild(object element) { @@ -2044,6 +2052,7 @@ namespace Xceed.Wpf.AvalonDock { (documentToRemove.Parent as ILayoutContainer).RemoveChild( documentToRemove); + this.RemoveViewFromLogicalChild( documentToRemove ); } } } @@ -2119,6 +2128,7 @@ namespace Xceed.Wpf.AvalonDock { (documentToRemove.Parent as ILayoutContainer).RemoveChild( documentToRemove); + this.RemoveViewFromLogicalChild( documentToRemove ); } } @@ -2143,6 +2153,7 @@ namespace Xceed.Wpf.AvalonDock { (documentToRemove.Parent as ILayoutContainer).RemoveChild( documentToRemove); + this.RemoveViewFromLogicalChild( documentToRemove ); } var documentsSourceAsNotifier = documentsSource as INotifyCollectionChanged; @@ -2167,6 +2178,8 @@ namespace Xceed.Wpf.AvalonDock if( document.CloseDocument() ) { + this.RemoveViewFromLogicalChild( document ); + if( DocumentClosed != null ) { var evargs = new DocumentClosedEventArgs( document ); @@ -2394,6 +2407,7 @@ namespace Xceed.Wpf.AvalonDock anchorableToRemove.Content = null; (anchorableToRemove.Parent as ILayoutContainer).RemoveChild( anchorableToRemove); + this.RemoveViewFromLogicalChild( anchorableToRemove ); } } } @@ -2484,6 +2498,7 @@ namespace Xceed.Wpf.AvalonDock { (anchorableToRemove.Parent as ILayoutContainer).RemoveChild( anchorableToRemove); + this.RemoveViewFromLogicalChild( anchorableToRemove ); } } @@ -2506,6 +2521,7 @@ namespace Xceed.Wpf.AvalonDock { (anchorableToRemove.Parent as ILayoutContainer).RemoveChild( anchorableToRemove); + this.RemoveViewFromLogicalChild( anchorableToRemove ); } var anchorablesSourceAsNotifier = anchorablesSource as INotifyCollectionChanged; @@ -2521,6 +2537,7 @@ namespace Xceed.Wpf.AvalonDock if (model != null ) { model.CloseAnchorable(); + this.RemoveViewFromLogicalChild( anchorable ); } } @@ -2554,6 +2571,18 @@ namespace Xceed.Wpf.AvalonDock content.DockAsDocument(); } + private void RemoveViewFromLogicalChild( LayoutContent layoutContent ) + { + if( layoutContent == null ) + return; + + var layoutItem = this.GetLayoutItemFromModel( layoutContent ); + if( layoutItem != null ) + { + this.InternalRemoveLogicalChild( layoutItem.View ); + } + } + #region ActiveContent /// diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Properties/AssemblyInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Properties/AssemblyInfo.cs index 7ebdb67a..f82cf8c3 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Properties/AssemblyInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Properties/AssemblyInfo.cs @@ -25,12 +25,12 @@ using System; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle( "Xceed Extended WPF Toolkit - AvalonDock" )] +[assembly: AssemblyTitle( "Xceed Toolkit for WPF - AvalonDock" )] [assembly: AssemblyDescription( "This assembly implements the Xceed.Wpf.AvalonDock namespace, a docking layout system for the Windows Presentation Framework." )] [assembly: AssemblyCompany( "Xceed Software Inc." )] -[assembly: AssemblyProduct( "Xceed Extended WPF Toolkit - AvalonDock" )] -[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2015" )] +[assembly: AssemblyProduct( "Xceed Toolkit for WPF - AvalonDock" )] +[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2016" )] [assembly: AssemblyCulture( "" )] diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.DataGrid/AssemblyVersionInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.DataGrid/AssemblyVersionInfo.cs index 0d5c200c..35aedd63 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.DataGrid/AssemblyVersionInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.DataGrid/AssemblyVersionInfo.cs @@ -19,7 +19,7 @@ internal static class _XceedVersionInfo { [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] - public const string BaseVersion = "2.9"; + public const string BaseVersion = "3.0"; [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] public const string Version = BaseVersion + ".0.0"; [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.DataGrid/Properties/AssemblyInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.DataGrid/Properties/AssemblyInfo.cs index 43e34d10..fd29c34b 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.DataGrid/Properties/AssemblyInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.DataGrid/Properties/AssemblyInfo.cs @@ -31,12 +31,12 @@ using System.Windows.Markup; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle( "Xceed Extended WPF Toolkit - DataGrid" )] +[assembly: AssemblyTitle( "Xceed Toolkit for WPF - DataGrid" )] [assembly: AssemblyDescription( "This assembly implements the Xceed.Wpf.DataGrid namespace, a data grid control for the Windows Presentation Framework." )] [assembly: AssemblyCompany( "Xceed Software Inc." )] -[assembly: AssemblyProduct( "Xceed Extended WPF Toolkit - DataGrid" )] -[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2015" )] +[assembly: AssemblyProduct( "Xceed Toolkit for WPF - DataGrid" )] +[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2016" )] [assembly: CLSCompliant( true )] diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/App.ico b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/App.ico index 77e821e7..94eeac58 100644 Binary files a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/App.ico and b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/App.ico differ diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/App.xaml b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/App.xaml index aeae0c93..cfd75b51 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/App.xaml +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/App.xaml @@ -1,14 +1,14 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:local="clr-namespace:Xceed.Wpf.Toolkit.LiveExplorer" + xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" + xmlns:sys="clr-namespace:System;assembly=mscorlib" + Title="DropDown and Split Buttons"> The DropDownButton control is a button that when clicked displays a drop down in which you can place any custom content within. @@ -27,6 +28,15 @@ The SplitButton control is a button that can be clicked and also provides a drop down in which you can place any custom content within. + + + + + + + @@ -39,6 +49,11 @@ + + + + + + + + @@ -75,6 +103,7 @@ HorizontalAlignment="Left" Content="Click Me" MaxDropDownHeight="{Binding Value, ElementName=maxDropDownHeight}" + DropDownPosition="{Binding SelectedItem, ElementName=dropDownPosition}" Click="DropDownButton_Click"> @@ -96,6 +125,7 @@ HorizontalAlignment="Left" Content="Click Me" MaxDropDownHeight="{Binding Value, ElementName=maxDropDownHeight}" + DropDownPosition="{Binding SelectedItem, ElementName=dropDownPosition}" Click="SplitButton_Click"> diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/FilePickerView.xaml.cs.txt b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/FilePickerView.xaml.cs.txt index adf3bb71..53bd8cdb 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/FilePickerView.xaml.cs.txt +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/FilePickerView.xaml.cs.txt @@ -1,14 +1,14 @@ /*************************************************************************************** - Extended WPF Toolkit + Toolkit for WPF - Copyright (C) 2007-2015 Xceed Software Inc. + Copyright (C) 2007-2016 Xceed Software Inc. This program is provided to you under the terms of the Microsoft Public License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license For more features, controls, and fast professional support, - pick up the Plus Edition at http://xceed.com/wpf_toolkit + pick up the Plus Edition at https://xceed.com/xceed-toolkit-plus-for-wpf/ Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/FilePickerView.xaml.txt b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/FilePickerView.xaml.txt index 3030ab75..af502785 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/FilePickerView.xaml.txt +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/FilePickerView.xaml.txt @@ -1,14 +1,14 @@  + + + + + + The MultiCalendar combines X Microsoft Calendars that can be positioned in a grid with rows and columns. The selected dates, blackout dates and highlighted dates can be chosen from any calendar. The MultiCalendar will have a fast response no matter how many CalendarDayButtons are selected. + + + The Background/Foreground of any CalendarDayButton can be easily customized based on its state(selected/highlighted/blackout/mouseOver/focused/today) and the background of any Calendar can be customized with an image or a brush. + + + This feature is only available in the "Plus" version. + + + Click here for more details about Xceed Toolkit Plus for WPF. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/MultiColumnComboBoxView.xaml.cs.txt b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/MultiColumnComboBoxView.xaml.cs.txt index 1fbd7bb9..1cbf8761 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/MultiColumnComboBoxView.xaml.cs.txt +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/MultiColumnComboBoxView.xaml.cs.txt @@ -1,14 +1,14 @@ /*************************************************************************************** - Extended WPF Toolkit + Toolkit for WPF - Copyright (C) 2007-2015 Xceed Software Inc. + Copyright (C) 2007-2016 Xceed Software Inc. This program is provided to you under the terms of the Microsoft Public License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license For more features, controls, and fast professional support, - pick up the Plus Edition at http://xceed.com/wpf_toolkit + pick up the Plus Edition at https://xceed.com/xceed-toolkit-plus-for-wpf/ Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/MultiColumnComboBoxView.xaml.txt b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/MultiColumnComboBoxView.xaml.txt index 61f28c02..f224c295 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/MultiColumnComboBoxView.xaml.txt +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/CodeFiles/MultiColumnComboBoxView.xaml.txt @@ -1,14 +1,14 @@  @@ -413,7 +415,7 @@ Value="True"> + Value="{StaticResource SampleDefaultBrush}" /> @@ -436,12 +438,16 @@ - + - + + @@ -621,7 +630,11 @@ + IsPlusOnlyFeature="True" /> + - + Fill="{StaticResource SampleDefaultBrush}" /> - Extended WPF Toolkit + NavigateUri="https://xceed.com/xceed-toolkit-plus-for-wpf/"> + Toolkit Plus diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/MainWindow.xaml.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/MainWindow.xaml.cs index 1ed144ab..36eed46a 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/MainWindow.xaml.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/MainWindow.xaml.cs @@ -1,14 +1,14 @@ /************************************************************************************* - Extended WPF Toolkit + Toolkit for WPF - Copyright (C) 2007-2015 Xceed Software Inc. + Copyright (C) 2007-2016 Xceed Software Inc. This program is provided to you under the terms of the Microsoft Public License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license For more features, controls, and fast professional support, - pick up the Plus Edition at http://xceed.com/wpf_toolkit + pick up the Plus Edition at https://xceed.com/xceed-toolkit-plus-for-wpf/ Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Properties/AssemblyInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Properties/AssemblyInfo.cs index 37166cf5..680187e5 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Properties/AssemblyInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Properties/AssemblyInfo.cs @@ -7,11 +7,11 @@ using System.Windows; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle( "Xceed Extended WPF Toolkit LiveExplorer" )] +[assembly: AssemblyTitle( "Xceed Toolkit for WPF LiveExplorer" )] [assembly: AssemblyDescription( "" )] [assembly: AssemblyCompany( "Xceed Software Inc." )] -[assembly: AssemblyProduct( "Xceed Extended WPF Toolkit" )] -[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2015" )] +[assembly: AssemblyProduct( "Xceed Toolkit for WPF" )] +[assembly: AssemblyCopyright( "Copyright (C) Xceed Software Inc. 2007-2016" )] [assembly: AssemblyCulture( "" )] // Setting ComVisible to false makes the types in this assembly not visible @@ -49,8 +49,8 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion( "2.9.*" )] -[assembly: AssemblyFileVersion( "2.9.0.0" )] +[assembly: AssemblyVersion( "3.0.*" )] +[assembly: AssemblyFileVersion( "3.0.0.0" )] #pragma warning disable 1699 [assembly: AssemblyDelaySign( false )] diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Properties/Resources.resx b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Properties/Resources.resx index 41922967..2b8c700e 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Properties/Resources.resx +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Properties/Resources.resx @@ -3,7 +3,7 @@ + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:local="clr-namespace:Xceed.Wpf.Toolkit.LiveExplorer" + xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" + xmlns:sys="clr-namespace:System;assembly=mscorlib" + Title="DropDown and Split Buttons"> The DropDownButton control is a button that when clicked displays a drop down in which you can place any custom content within. @@ -27,6 +28,15 @@ The SplitButton control is a button that can be clicked and also provides a drop down in which you can place any custom content within. + + + + + + + @@ -39,6 +49,11 @@ + + + + + + + + @@ -75,6 +103,7 @@ HorizontalAlignment="Left" Content="Click Me" MaxDropDownHeight="{Binding Value, ElementName=maxDropDownHeight}" + DropDownPosition="{Binding SelectedItem, ElementName=dropDownPosition}" Click="DropDownButton_Click"> @@ -96,6 +125,7 @@ HorizontalAlignment="Left" Content="Click Me" MaxDropDownHeight="{Binding Value, ElementName=maxDropDownHeight}" + DropDownPosition="{Binding SelectedItem, ElementName=dropDownPosition}" Click="SplitButton_Click"> diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Button/Views/DropDownSplitButtonView.xaml.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Button/Views/DropDownSplitButtonView.xaml.cs index 07fd4ea0..514308b9 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Button/Views/DropDownSplitButtonView.xaml.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Button/Views/DropDownSplitButtonView.xaml.cs @@ -1,14 +1,14 @@ /*************************************************************************************** - Extended WPF Toolkit + Toolkit for WPF - Copyright (C) 2007-2015 Xceed Software Inc. + Copyright (C) 2007-2016 Xceed Software Inc. This program is provided to you under the terms of the Microsoft Public License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license For more features, controls, and fast professional support, - pick up the Plus Edition at http://xceed.com/wpf_toolkit + pick up the Plus Edition at https://xceed.com/xceed-toolkit-plus-for-wpf/ Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Calculator/Views/CalculatorView.xaml b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Calculator/Views/CalculatorView.xaml index a97f678c..894a52c8 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Calculator/Views/CalculatorView.xaml +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Calculator/Views/CalculatorView.xaml @@ -1,14 +1,14 @@  + + + + + + The MultiCalendar combines X Microsoft Calendars that can be positioned in a grid with rows and columns. The selected dates, blackout dates and highlighted dates can be chosen from any calendar. The MultiCalendar will have a fast response no matter how many CalendarDayButtons are selected. + + + The Background/Foreground of any CalendarDayButton can be easily customized based on its state(selected/highlighted/blackout/mouseOver/focused/today) and the background of any Calendar can be customized with an image or a brush. + + + This feature is only available in the "Plus" version. + + + Click here for more details about Xceed Toolkit Plus for WPF. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/MultiCalendar/Views/MultiCalendarView.xaml.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/MultiCalendar/Views/MultiCalendarView.xaml.cs new file mode 100644 index 00000000..e6f2523b --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/MultiCalendar/Views/MultiCalendarView.xaml.cs @@ -0,0 +1,45 @@ +/************************************************************************************* + + Toolkit for WPF + + Copyright (C) 2007-2014 Xceed Software Inc. + + This program is provided to you under the terms of the Microsoft Public + License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license + + For more features, controls, and fast professional support, + pick up the Plus Edition at https://xceed.com/xceed-toolkit-plus-for-wpf/ + + Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids + + ***********************************************************************************/ + +using System.Windows.Controls; +using System; +using System.Windows.Media; +using System.Windows; + +namespace Xceed.Wpf.Toolkit.LiveExplorer.Samples.MultiCalendar.Views +{ + /// + /// Interaction logic for MultiCalendarView.xaml + /// + public partial class MultiCalendarView : DemoView + { + public MultiCalendarView() + { + InitializeComponent(); + } + + + + + + + + + + + + } +} diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Numeric/Views/NumericView.xaml b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Numeric/Views/NumericView.xaml index d7025191..9f46a868 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Numeric/Views/NumericView.xaml +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Numeric/Views/NumericView.xaml @@ -1,14 +1,14 @@  + + + + + The WatermarkPasswordBox is a PasswordBox where you can enter a secure password and display a watermark when the password is not defined. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Text/Views/WatermarkPasswordBoxView.xaml.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Text/Views/WatermarkPasswordBoxView.xaml.cs new file mode 100644 index 00000000..c09b86ce --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Text/Views/WatermarkPasswordBoxView.xaml.cs @@ -0,0 +1,39 @@ +/************************************************************************************** + + Toolkit for WPF + + Copyright (C) 2007-2016 Xceed Software Inc. + + This program is provided to you under the terms of the Microsoft Public + License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license + + For more features, controls, and fast professional support, + pick up the Plus Edition at https://xceed.com/xceed-toolkit-plus-for-wpf/ + + Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids + + **************************************************************************************/ + + +namespace Xceed.Wpf.Toolkit.LiveExplorer.Samples.Text.Views +{ + /// + /// Interaction logic for WatermarkPasswordBoxView.xaml + /// + public partial class WatermarkPasswordBoxView : DemoView + { + public WatermarkPasswordBoxView() + { + InitializeComponent(); + } + + private void WatermarkPasswordBox_PasswordChanged( object sender, System.Windows.RoutedEventArgs e ) + { + var passwordBox = sender as WatermarkPasswordBox; + if( passwordBox != null ) + { + _passwordTextBlock.Text = passwordBox.Password; + } + } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Text/Views/WatermarkTextboxView.xaml b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Text/Views/WatermarkTextboxView.xaml index db4921a5..f68a4584 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Text/Views/WatermarkTextboxView.xaml +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit.LiveExplorer/Samples/Text/Views/WatermarkTextboxView.xaml @@ -1,14 +1,14 @@  + @@ -252,6 +253,9 @@ MaterialControlsView.xaml + + MultiCalendarView.xaml + NumericView.xaml @@ -351,6 +355,9 @@ RichTextboxView.xaml + + WatermarkPasswordBoxView.xaml + WatermarkTextboxView.xaml @@ -613,6 +620,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + MSBuild:Compile Designer @@ -733,6 +744,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + MSBuild:Compile Designer @@ -844,9 +859,6 @@ - - - @@ -1329,6 +1341,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/AssemblyVersionInfo.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/AssemblyVersionInfo.cs index 84bce886..d3cc2ce9 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/AssemblyVersionInfo.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/AssemblyVersionInfo.cs @@ -21,7 +21,7 @@ internal static class _XceedVersionInfo { [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] - public const string BaseVersion = "2.9"; + public const string BaseVersion = "3.0"; [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields" )] public const string Version = BaseVersion + ".0.0"; diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Implementation/CalculatorUpDown.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Implementation/CalculatorUpDown.cs index f30f30c4..61cc813e 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Implementation/CalculatorUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Implementation/CalculatorUpDown.cs @@ -98,7 +98,7 @@ namespace Xceed.Wpf.Toolkit protected virtual void OnIsOpenChanged( bool oldValue, bool newValue ) { if( newValue ) - _initialValue = Value; + _initialValue = this.UpdateValueOnEnterKey ? this.ConvertTextToValue( this.TextBox.Text ) : this.Value; } #endregion //IsOpen @@ -181,7 +181,14 @@ namespace Xceed.Wpf.Toolkit { if( IsValid( _calculator.Value ) ) { - this.Value = _calculator.Value; + if( this.UpdateValueOnEnterKey ) + { + this.TextBox.Text = (_calculator.Value != null) ? _calculator.Value.Value.ToString( this.FormatString, this.CultureInfo ) : null; + } + else + { + this.Value = _calculator.Value; + } } } @@ -193,7 +200,8 @@ namespace Xceed.Wpf.Toolkit { if( _calculator != null ) { - _calculator.InitializeToValue( this.Value ); + var initValue = this.UpdateValueOnEnterKey ? this.ConvertTextToValue( this.TextBox.Text ) : this.Value; + _calculator.InitializeToValue( initValue ); _calculator.Focus(); } } @@ -231,7 +239,16 @@ namespace Xceed.Wpf.Toolkit else if( e.Key == Key.Escape ) { if( EnterClosesCalculator ) - Value = _initialValue; + { + if( this.UpdateValueOnEnterKey ) + { + this.TextBox.Text = (_initialValue != null) ? _initialValue.Value.ToString( this.FormatString, this.CultureInfo ) : null; + } + else + { + this.Value = _initialValue; + } + } CloseCalculatorUpDown( true ); e.Handled = true; } diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Themes/Aero2.NormalColor.xaml b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Themes/Aero2.NormalColor.xaml index c86d9e57..71d8097e 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Themes/Aero2.NormalColor.xaml +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Themes/Aero2.NormalColor.xaml @@ -24,7 +24,8 @@ - + + @@ -53,7 +54,12 @@ - + diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Themes/Generic.xaml b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Themes/Generic.xaml index d12d9758..93a827ef 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Themes/Generic.xaml +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CalculatorUpDown/Themes/Generic.xaml @@ -22,6 +22,10 @@ xmlns:conv="clr-namespace:Xceed.Wpf.Toolkit.Core.Converters" xmlns:sys="clr-namespace:System;assembly=mscorlib"> + + + + @@ -61,7 +65,12 @@ - + diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/ChildWindow/Implementation/ChildWindow.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/ChildWindow/Implementation/ChildWindow.cs index e303880c..4df3bbd5 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/ChildWindow/Implementation/ChildWindow.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/ChildWindow/Implementation/ChildWindow.cs @@ -55,6 +55,7 @@ namespace Xceed.Wpf.Toolkit private Grid _windowRoot; private WindowControl _windowControl; private bool _ignorePropertyChanged; + private bool _hasChildren; private bool _hasWindowContainer; #endregion //Private Members @@ -333,6 +334,8 @@ namespace Xceed.Wpf.Toolkit _modalLayer.Fill = OverlayBrush; _modalLayer.Opacity = OverlayOpacity; + + this.IsVisibleChanged += this.ChildWindow_IsVisibleChanged; } #endregion //Constructors @@ -423,12 +426,48 @@ namespace Xceed.Wpf.Toolkit Action action = () => { if( FocusedElement != null ) + { + _hasChildren = true; FocusedElement.Focus(); + } + else + { + //Focus first Focusable Child element of ChildWindow + var focusableChild = TreeHelper.FindChild( this.Content as DependencyObject, x => x.Focusable ); + if( focusableChild != null ) + { + _hasChildren = true; + focusableChild.Focus(); + } + else + { + _hasChildren = false; + } + } }; Dispatcher.BeginInvoke( DispatcherPriority.ApplicationIdle, action ); } + protected override void OnPreviewKeyDown( KeyEventArgs e ) + { + base.OnPreviewKeyDown( e ); + + if( this.IsModal ) + { + // Prevent MenuItem shortcuts while ChildWindow is modal. + if( Keyboard.IsKeyDown( Key.LeftAlt ) || Keyboard.IsKeyDown( Key.RightAlt ) ) + { + e.Handled = true; + } + // Prevent Tab when no children + else if( (e.Key == Key.Tab) && !_hasChildren ) + { + e.Handled = true; + } + } + } + protected override void OnKeyDown( KeyEventArgs e ) { base.OnKeyDown( e ); @@ -617,6 +656,14 @@ namespace Xceed.Wpf.Toolkit Top = GetRestrictedTop(); } + private void ChildWindow_IsVisibleChanged( object sender, DependencyPropertyChangedEventArgs e ) + { + if( (bool)e.NewValue && this.IsModal ) + { + this.Focus(); + } + } + #endregion //Event Handlers diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/ChildWindow/Themes/Aero2.NormalColor.xaml b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/ChildWindow/Themes/Aero2.NormalColor.xaml index ff971a58..2a5bd5ef 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/ChildWindow/Themes/Aero2.NormalColor.xaml +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/ChildWindow/Themes/Aero2.NormalColor.xaml @@ -72,7 +72,8 @@ Height="{TemplateBinding Height}"> 0) ? dict.GetType().GetGenericArguments()[0] : typeof( object ); + var valueType = (item.Value != null) + ? item.Value.GetType() + : (dict.GetType().GetGenericArguments().Count() > 1) ? dict.GetType().GetGenericArguments()[ 1 ] : typeof( object ); + var editableKeyValuePair = ListUtilities.CreateEditableKeyValuePair( item.Key + , keyType + , item.Value + , valueType ); + this.Items.Add( editableKeyValuePair ); + } + } + else + { + foreach( var item in newValue ) + { + if( item != null ) + { + Items.Add( item ); + } } } } @@ -175,15 +200,27 @@ namespace Xceed.Wpf.Toolkit base.OnApplyTemplate(); if( _newItemTypesComboBox != null ) + { _newItemTypesComboBox.Loaded -= new RoutedEventHandler( this.NewItemTypesComboBox_Loaded ); - + } _newItemTypesComboBox = GetTemplateChild( PART_NewItemTypesComboBox ) as ComboBox; - if( _newItemTypesComboBox != null ) + { _newItemTypesComboBox.Loaded += new RoutedEventHandler( this.NewItemTypesComboBox_Loaded ); + } + + _listBox = this.GetTemplateChild( PART_ListBox ) as ListBox; + if( _propertyGrid != null ) + { + _propertyGrid.PropertyValueChanged -= this.PropertyGrid_PropertyValueChanged; + } _propertyGrid = GetTemplateChild( PART_PropertyGrid ) as PropertyGrid.PropertyGrid; - } + if( _propertyGrid != null ) + { + _propertyGrid.PropertyValueChanged += this.PropertyGrid_PropertyValueChanged; + } + } public PropertyGrid.PropertyGrid PropertyGrid { @@ -343,6 +380,14 @@ namespace Xceed.Wpf.Toolkit _newItemTypesComboBox.SelectedIndex = 0; } + private void PropertyGrid_PropertyValueChanged( object sender, PropertyGrid.PropertyValueChangedEventArgs e ) + { + if( _listBox != null ) + { + _listBox.Items.Refresh(); + } + } + #endregion #region Commands @@ -442,41 +487,87 @@ namespace Xceed.Wpf.Toolkit internal void PersistChanges( IList sourceList ) { - IList list = ComputeItemsSource(); - if( list == null ) + var collection = ComputeItemsSource(); + if( collection == null ) return; - //the easiest way to persist changes to the source is to just clear the source list and then add all items to it. - list.Clear(); + //IDictionary and IDictionary + if( collection is IDictionary ) + { + //For a Dictionary, we need to parse the list of EditableKeyValuePair and add KeyValuePair to the Dictionary. + var dict = (IDictionary)collection; + //the easiest way to persist changes to the source is to just clear the source list and then add all items to it. + dict.Clear(); - if( list.IsFixedSize ) + foreach( var item in sourceList ) + { + var propInfoKey = item.GetType().GetProperty( "Key" ); + var propInfoValue = item.GetType().GetProperty( "Value" ); + if( (propInfoKey != null) && (propInfoValue != null) ) + { + dict.Add( propInfoKey.GetValue( item, null ), propInfoValue.GetValue( item, null ) ); + } + } + } + //IList + else if( collection is IList ) { - for( int i = 0; i < sourceList.Count; ++i ) - list[ i ] = sourceList[ i ]; + var list = (IList)collection; + + //the easiest way to persist changes to the source is to just clear the source list and then add all items to it. + list.Clear(); + + if( list.IsFixedSize ) + { + for( int i = 0; i < sourceList.Count; ++i ) + list[ i ] = sourceList[ i ]; + } + else + { + foreach( var item in sourceList ) + { + list.Add( item ); + } + } } else { - foreach( var item in sourceList ) + //ICollection (or IList) + var collectionType = collection.GetType(); + var iCollectionOfTInterface = collectionType.GetInterfaces().FirstOrDefault( x => x.IsGenericType && (x.GetGenericTypeDefinition() == typeof( ICollection<> )) ); + if( iCollectionOfTInterface != null ) { - list.Add( item ); + var argumentType = iCollectionOfTInterface.GetGenericArguments().FirstOrDefault(); + if( argumentType != null ) + { + var iCollectionOfTType = typeof( ICollection<> ).MakeGenericType( argumentType ); + + //the easiest way to persist changes to the source is to just clear the source list and then add all items to it. + iCollectionOfTType.GetMethod( "Clear" ).Invoke( collection, null ); + + foreach( var item in sourceList ) + { + iCollectionOfTType.GetMethod( "Add" ).Invoke( collection, new object[] { item } ); + } + } } } } - private IList CreateItemsSource() + private IEnumerable CreateItemsSource() { - IList list = null; + IEnumerable collection = null; if( ItemsSourceType != null ) { - ConstructorInfo constructor = ItemsSourceType.GetConstructor( Type.EmptyTypes ); + var constructor = ItemsSourceType.GetConstructor( Type.EmptyTypes ); if( constructor != null ) { - list = ( IList )constructor.Invoke( null ); + collection = (IEnumerable)constructor.Invoke( null ); } } - return list; + return collection; } private object CreateNewItem( Type type ) @@ -484,7 +575,7 @@ namespace Xceed.Wpf.Toolkit return Activator.CreateInstance( type ); } - private IList ComputeItemsSource() + private IEnumerable ComputeItemsSource() { if( ItemsSource == null ) ItemsSource = CreateItemsSource(); diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Implementation/CollectionControlButton.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Implementation/CollectionControlButton.cs index 644b6b61..e410e072 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Implementation/CollectionControlButton.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Implementation/CollectionControlButton.cs @@ -17,8 +17,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Windows; using System.Windows.Controls; @@ -61,12 +59,12 @@ namespace Xceed.Wpf.Toolkit #region ItemsSource Property - public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register( "ItemsSource", typeof( IList ), typeof( CollectionControlButton ), new UIPropertyMetadata( null ) ); - public IList ItemsSource + public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register( "ItemsSource", typeof( IEnumerable ), typeof( CollectionControlButton ), new UIPropertyMetadata( null ) ); + public IEnumerable ItemsSource { get { - return ( IList )GetValue( ItemsSourceProperty ); + return (IEnumerable)GetValue( ItemsSourceProperty ); } set { diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Implementation/CollectionControlDialog.xaml.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Implementation/CollectionControlDialog.xaml.cs index b9196386..24e2436c 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Implementation/CollectionControlDialog.xaml.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Implementation/CollectionControlDialog.xaml.cs @@ -17,8 +17,13 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics; using System.Windows; using System.Windows.Media; +using Xceed.Wpf.Toolkit.Core.Utilities; +using System.Linq; +using System.Runtime.Serialization; +using System.Security; namespace Xceed.Wpf.Toolkit { @@ -40,12 +45,12 @@ namespace Xceed.Wpf.Toolkit #region Properties - public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register( "ItemsSource", typeof( IList ), typeof( CollectionControlDialog ), new UIPropertyMetadata( null ) ); - public IList ItemsSource + public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register( "ItemsSource", typeof( IEnumerable ), typeof( CollectionControlDialog ), new UIPropertyMetadata( null ) ); + public IEnumerable ItemsSource { get { - return ( IList )GetValue( ItemsSourceProperty ); + return (IEnumerable)GetValue( ItemsSourceProperty ); } set { @@ -145,6 +150,15 @@ namespace Xceed.Wpf.Toolkit private void OkButton_Click( object sender, RoutedEventArgs e ) { + if( this.ItemsSource is IDictionary ) + { + if( !this.AreDictionaryKeysValid() ) + { + MessageBox.Show( "All dictionary items should have distinct non-null Key values.", "Warning" ); + return; + } + } + _collectionControl.PersistChanges(); this.DialogResult = true; this.Close(); @@ -157,40 +171,96 @@ namespace Xceed.Wpf.Toolkit this.Close(); } -#endregion //Event Hanlders + #endregion //Event Hanlders -#region Private Methods + #region Private Methods + [SecuritySafeCritical] private object Clone( object source ) { + if( source == null ) + return null; + + object result = null; var sourceType = source.GetType(); - //Get default constructor - var result = sourceType.GetConstructor( new Type[] { } ).Invoke( null ); - var properties = sourceType.GetProperties(); - foreach( var propertyInfo in properties ) + // For IDictionary, we need to create EditableKeyValuePair to edit the Key-Value. + if( (this.ItemsSource is IDictionary) + && sourceType.IsGenericType + && typeof( KeyValuePair<,> ).IsAssignableFrom( sourceType.GetGenericTypeDefinition() ) ) + { + result = this.GenerateEditableKeyValuePair( source ); + } + else { - var propertyInfoValue = propertyInfo.GetValue( source, null ); + // Initialized a new object with default values + result = FormatterServices.GetUninitializedObject( sourceType ); + } + Debug.Assert( result != null ); + if( result != null ) + { + var properties = sourceType.GetProperties(); - if( propertyInfo.CanWrite ) + foreach( var propertyInfo in properties ) { - //Look for nested object - if( propertyInfo.PropertyType.IsClass && (propertyInfo.PropertyType != typeof(Transform)) && !propertyInfo.PropertyType.Equals( typeof( string ) ) ) - { - var nestedObject = this.Clone( propertyInfoValue ); - propertyInfo.SetValue( result, nestedObject, null ); - } - else + var propertyInfoValue = propertyInfo.GetValue( source, null ); + + if( propertyInfo.CanWrite ) { - // copy object - propertyInfo.SetValue( result, propertyInfoValue, null ); + //Look for nested object + if( propertyInfo.PropertyType.IsClass + && (propertyInfo.PropertyType != typeof( Transform )) + && !propertyInfo.PropertyType.Equals( typeof( string ) ) ) + { + var nestedObject = this.Clone( propertyInfoValue ); + propertyInfo.SetValue( result, nestedObject, null ); + } + else + { + // copy object + propertyInfo.SetValue( result, propertyInfoValue, null ); + } } } - } + } return result; } + private object GenerateEditableKeyValuePair( object source ) + { + var sourceType = source.GetType(); + if( (sourceType.GetGenericArguments() == null) || (sourceType.GetGenericArguments().GetLength( 0 ) != 2) ) + return null; + + var propInfoKey = sourceType.GetProperty( "Key" ); + var propInfoValue = sourceType.GetProperty( "Value" ); + if( (propInfoKey != null) && (propInfoValue != null) ) + { + return ListUtilities.CreateEditableKeyValuePair( propInfoKey.GetValue( source, null ) + , sourceType.GetGenericArguments()[ 0 ] + , propInfoValue.GetValue( source, null ) + , sourceType.GetGenericArguments()[ 1 ] ); + } + return null; + } + + private bool AreDictionaryKeysValid() + { + var keys = _collectionControl.Items.Select( x => + { + var keyType = x.GetType().GetProperty( "Key" ); + if( keyType != null ) + { + return keyType.GetValue( x, null ); + } + return null; + } ); + + return (keys.Distinct().Count() == _collectionControl.Items.Count ) + && keys.All( x => x != null ); + } + #endregion } } diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Themes/Aero2.NormalColor.xaml b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Themes/Aero2.NormalColor.xaml index 2f4cb4f4..5a657dfd 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Themes/Aero2.NormalColor.xaml +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Themes/Aero2.NormalColor.xaml @@ -23,7 +23,11 @@ xmlns:chrome="clr-namespace:Xceed.Wpf.Toolkit.Chromes" xmlns:pg="clr-namespace:Xceed.Wpf.Toolkit.PropertyGrid"> - + + + + + @@ -91,7 +95,7 @@ Content="Add" Command="New" CommandParameter="{Binding SelectedItem, ElementName=PART_NewItemTypesComboBox}" /> - @@ -229,10 +233,11 @@ RenderMouseOver="{TemplateBinding IsMouseOver}"> + Width="9" + Height="5" + Data="{StaticResource DownArrowGeometry}" + Fill="#FF000000" + Margin="0,1,0,0"/> diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Themes/Generic.xaml b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Themes/Generic.xaml index 00090181..5ef46daf 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Themes/Generic.xaml +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/CollectionControl/Themes/Generic.xaml @@ -22,6 +22,10 @@ xmlns:chrome="clr-namespace:Xceed.Wpf.Toolkit.Chromes" xmlns:pg="clr-namespace:Xceed.Wpf.Toolkit.PropertyGrid"> + + + + @@ -102,7 +106,7 @@ Content="Add" Command="New" CommandParameter="{Binding SelectedItem, ElementName=PART_NewItemTypesComboBox}" /> -