diff --git a/README.md b/README.md
index ecc8fb13..8276ff5f 100644
--- a/README.md
+++ b/README.md
@@ -125,9 +125,12 @@ This repository contains the samples that demonstrate the functionalities of Dia
Swimlane
- Swimlane
+ PageBreaks
- Swimlane
+ RubberBandZoom
+
+
+ Panning
diff --git a/Samples/Container/RestrictNodeFromContainer/README.md b/Samples/Container/RestrictNodeFromContainer/README.md
new file mode 100644
index 00000000..54636968
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/README.md
@@ -0,0 +1,14 @@
+# RestrictNodeFromContainer sample
+
+This sample explains how to restrict node is being removed from its parent container when dragging.
+
+__*Documentation*__: https://help.syncfusion.com/wpf/diagram/container
+
+## Project pre-requisites
+To run this application, you need to have the below two in your system
+
+* [Visual Studio 2019](https://www.visualstudio.com/wpf-vs)
+* [Syncfusion.SfDiagram.WPF](https://www.nuget.org/packages/Syncfusion.SfDiagram.WPF/) nuget package. To install the package using NuGet Package Manager, refer this [link](https://docs.microsoft.com/en-us/nuget/quickstart/install-and-use-a-package-in-visual-studio#nuget-package-manager).
+
+## Deploying and running the sample
+* To debug the sample and then run it, press F5 or select Debug > Start Debugging. To run the sample without debugging, press Ctrl+F5 or selectDebug > Start Without Debugging.
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer.sln b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer.sln
new file mode 100644
index 00000000..1913898d
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.8.34309.116
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestrictNodeFromContainer", "RestrictNodeFromContainer\RestrictNodeFromContainer.csproj", "{69520CAF-FA5D-42BC-9D32-A7ACB2259509}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {69520CAF-FA5D-42BC-9D32-A7ACB2259509}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {69520CAF-FA5D-42BC-9D32-A7ACB2259509}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {69520CAF-FA5D-42BC-9D32-A7ACB2259509}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {69520CAF-FA5D-42BC-9D32-A7ACB2259509}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {5BAE0B49-4312-4887-B241-C0F900EB9495}
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/App.config b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/App.config
new file mode 100644
index 00000000..b50c74f3
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/App.xaml b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/App.xaml
new file mode 100644
index 00000000..ee439459
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/App.xaml.cs b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/App.xaml.cs
new file mode 100644
index 00000000..98986893
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/App.xaml.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace RestrictNodeFromContainer
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ }
+}
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/MainWindow.xaml b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/MainWindow.xaml
new file mode 100644
index 00000000..1c4203a3
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/MainWindow.xaml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/MainWindow.xaml.cs b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/MainWindow.xaml.cs
new file mode 100644
index 00000000..675a5301
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/MainWindow.xaml.cs
@@ -0,0 +1,146 @@
+using Syncfusion.UI.Xaml.Diagram;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace RestrictNodeFromContainer
+{
+ ///
+ /// Interaction logic for MainWindow.xaml
+ ///
+ public partial class MainWindow : Window
+ {
+ public MainWindow()
+ {
+ InitializeComponent();
+ diagram.Groups = new GroupCollection();
+ diagram.Nodes = new NodeCollection();
+ (diagram.Info as IGraphInfo).NodeChangedEvent += MainWindow_NodeChangedEvent;
+ (diagram.Info as IGraphInfo).ItemAdded += MainWindow_ItemAdded;
+ CustomNodeVM node1 = new CustomNodeVM()
+ {
+ ID = "Node1",
+ UnitWidth = 100,
+ UnitHeight = 100,
+ OffsetX = 250,
+ OffsetY = 260,
+ //Specify shape to the Node from built-in Shape Dictionary
+ Shape = this.Resources["Rectangle"],
+
+ };
+
+ //Add Node to Nodes property of the Diagram
+ (diagram.Nodes as NodeCollection).Add(node1);
+
+
+ CustomNodeVM node2 = new CustomNodeVM()
+ {
+ ID = "Node2",
+ UnitWidth = 100,
+ UnitHeight = 100,
+ OffsetX = 380,
+ OffsetY = 380,
+ //Specify shape to the Node from built-in Shape Dictionary
+ Shape = this.Resources["Rectangle"],
+
+ };
+
+ //Add Node to Nodes property of the Diagram
+ (diagram.Nodes as NodeCollection).Add(node2);
+
+
+ ObservableCollection groups = new ObservableCollection();
+ ContainerViewModel container = new ContainerViewModel()
+ {
+ Nodes = new ObservableCollection() { node1, node2 },
+ UnitHeight = 300,
+ UnitWidth = 300,
+ OffsetX = 300,
+ OffsetY = 300,
+ };
+ container.Header = new ContainerHeaderViewModel()
+ {
+ UnitHeight = 30,
+
+ Annotation = new AnnotationEditorViewModel()
+ {
+ Content = "Container Header",
+ FontSize = 16,
+ FontWeight = FontWeights.Bold,
+ Foreground = Brushes.Black,
+ ReadOnly = true,
+ },
+ };
+ groups.Add(container);
+ diagram.Groups = groups;
+ }
+
+ private void MainWindow_ItemAdded(object sender, ItemAddedEventArgs args)
+ {
+ if (args.Item is ContainerViewModel)
+ {
+ var container = (ContainerViewModel)args.Item;
+ if ((container.Nodes as IEnumerable).Any())
+ {
+ foreach (var item in container.Nodes as IEnumerable)
+ {
+ var node = item as CustomNodeVM;
+ //setting parent container to the nodes.
+ node.ParentContainer = container;
+ }
+ }
+ }
+ }
+
+ private void MainWindow_NodeChangedEvent(object sender, ChangeEventArgs args)
+ {
+ if (args.Item is CustomNodeVM && !(args.Item is ContainerViewModel))
+ {
+ var node = args.Item as CustomNodeVM;
+ if (node.ParentContainer != null && args.NewValue.InteractionState == NodeChangedInteractionState.Dragging)
+ {
+ ContainerViewModel parentcontainer = node.ParentContainer as ContainerViewModel;
+ Rect parentContainerBounds = (parentcontainer.Info as IContainerInfo).Bounds;
+ //Setting Node’s parent container bounds region value to BoundaryConstraint property.
+ args.BoundaryConstraints = new Rect(parentContainerBounds.Left + 5, parentContainerBounds.Top + 45,
+ parentContainerBounds.Width - 10, parentContainerBounds.Height - 50);
+ }
+ }
+ }
+ }
+ public class CustomNodeVM : NodeViewModel
+ {
+ private ContainerViewModel parentContainer = null;
+
+ ///
+ /// Gets or sets the Parent Container of the Node.
+ ///
+ public ContainerViewModel ParentContainer
+ {
+ get
+ {
+ return parentContainer;
+ }
+ set
+ {
+ if (parentContainer != value)
+ {
+ parentContainer = value;
+ OnPropertyChanged("ParentContainer");
+ }
+ }
+ }
+ }
+}
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/AssemblyInfo.cs b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..01d0b6dd
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+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("RestrictNodeFromContainer")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("RestrictNodeFromContainer")]
+[assembly: AssemblyCopyright("Copyright © 2024")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//CultureYouAreCodingWith in your .csproj file
+//inside a . For example, if you are using US english
+//in your source files, set the to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Resources.Designer.cs b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..71e719db
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace RestrictNodeFromContainer.Properties
+{
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RestrictNodeFromContainer.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Resources.resx b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Resources.resx
new file mode 100644
index 00000000..af7dbebb
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Settings.Designer.cs b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Settings.Designer.cs
new file mode 100644
index 00000000..0d867dc6
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace RestrictNodeFromContainer.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Settings.settings b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Settings.settings
new file mode 100644
index 00000000..033d7a5e
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer.csproj b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer.csproj
new file mode 100644
index 00000000..807f85b2
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer.csproj
@@ -0,0 +1,108 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {69520CAF-FA5D-42BC-9D32-A7ACB2259509}
+ WinExe
+ RestrictNodeFromContainer
+ RestrictNodeFromContainer
+ v4.6.2
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\Syncfusion.Licensing.25.1.35\lib\net462\Syncfusion.Licensing.dll
+
+
+ ..\packages\Syncfusion.SfDiagram.WPF.25.1.35\lib\net462\Syncfusion.SfDiagram.WPF.dll
+
+
+ ..\packages\Syncfusion.Shared.WPF.25.1.35\lib\net462\Syncfusion.Shared.WPF.dll
+
+
+
+
+
+
+
+
+
+
+ 4.0
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+ App.xaml
+ Code
+
+
+ MainWindow.xaml
+ Code
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/packages.config b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/packages.config
new file mode 100644
index 00000000..acef62f8
--- /dev/null
+++ b/Samples/Container/RestrictNodeFromContainer/RestrictNodeFromContainer/RestrictNodeFromContainer/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource.sln b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource.sln
new file mode 100644
index 00000000..31d4cfd1
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource.sln
@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.8.34309.116
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomDataSource", "CustomDataSource\CustomDataSource.csproj", "{2115284A-6B1C-4173-A879-60D9C9BE7981}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ Release-Xml|Any CPU = Release-Xml|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {2115284A-6B1C-4173-A879-60D9C9BE7981}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2115284A-6B1C-4173-A879-60D9C9BE7981}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2115284A-6B1C-4173-A879-60D9C9BE7981}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2115284A-6B1C-4173-A879-60D9C9BE7981}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2115284A-6B1C-4173-A879-60D9C9BE7981}.Release-Xml|Any CPU.ActiveCfg = Release|Any CPU
+ {2115284A-6B1C-4173-A879-60D9C9BE7981}.Release-Xml|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {079F52C6-230D-477D-B04E-7B6A22DDB7FA}
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/App.config b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/App.config
new file mode 100644
index 00000000..b50c74f3
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/App.xaml b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/App.xaml
new file mode 100644
index 00000000..3debb701
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/App.xaml.cs b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/App.xaml.cs
new file mode 100644
index 00000000..edb78d71
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/App.xaml.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace CustomDataSource
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ }
+}
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/CustomDataSource.csproj b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/CustomDataSource.csproj
new file mode 100644
index 00000000..4cac26a8
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/CustomDataSource.csproj
@@ -0,0 +1,116 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {2115284A-6B1C-4173-A879-60D9C9BE7981}
+ WinExe
+ CustomDataSource
+ CustomDataSource
+ v4.6.2
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\Syncfusion.Licensing.24.2.9\lib\net46\Syncfusion.Licensing.dll
+
+
+ ..\packages\Syncfusion.SfDiagram.WPF.24.2.9\lib\net46\Syncfusion.SfDiagram.WPF.dll
+
+
+ ..\packages\Syncfusion.Shared.WPF.24.2.9\lib\net46\Syncfusion.Shared.WPF.dll
+
+
+
+
+
+
+
+
+
+
+ 4.0
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+ App.xaml
+ Code
+
+
+ MainWindow.xaml
+ Code
+
+
+ Designer
+ MSBuild:Compile
+
+
+
+
+
+ NodeCreate.xaml
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/MainWindow.xaml b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/MainWindow.xaml
new file mode 100644
index 00000000..6c1a1bb0
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/MainWindow.xaml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/MainWindow.xaml.cs b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/MainWindow.xaml.cs
new file mode 100644
index 00000000..eff435f5
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/MainWindow.xaml.cs
@@ -0,0 +1,433 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO.Packaging;
+using System.Linq;
+using System.Reflection.Emit;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using System.Xml.Linq;
+using CustomDataSource.Model;
+using Syncfusion.UI.Xaml.Diagram;
+using Syncfusion.UI.Xaml.Diagram.Controls;
+using Syncfusion.UI.Xaml.Diagram.Serializer;
+using Syncfusion.Windows.Shared;
+
+namespace CustomDataSource
+{
+ ///
+ /// Interaction logic for MainWindow.xaml
+ ///
+ public partial class MainWindow : Window
+ {
+ public MainWindow()
+ {
+ InitializeComponent();
+ diagram.Nodes = new NodeCollection();
+ diagram.Connectors = new ConnectorCollection();
+ diagram.HorizontalRuler = new Ruler();
+ diagram.VerticalRuler = new Ruler() { Orientation = Orientation.Vertical };
+ (diagram.Info as IGraphInfo).ViewPortChangedEvent += MainWindow_ViewPortChangedEvent;
+
+ }
+
+ private void MainWindow_ViewPortChangedEvent(object sender, ChangeEventArgs args)
+ {
+ if (diagram.IsLoaded)
+ {
+ diagram.ViewPortCentreX = args.NewValue.ViewPort.Width / 2;
+ diagram.ViewPortCentreY = args.NewValue.ViewPort.Y;
+ }
+ }
+
+ private void diagram_Loaded(object sender, RoutedEventArgs e)
+ {
+ diagram.CustomData = GetData();
+
+ CustomUpdateLayout();
+
+ (diagram.Info as IGraphInfo).Commands.FitToPage.Execute(null);
+ }
+
+ #region Helper Methods
+
+ private void CustomUpdateLayout()
+ {
+ SetLevelForNodeData();
+
+ CreateDiagramUsingData();
+
+ UpdatePosition();
+
+ CreateConnection();
+ }
+
+ ///
+ /// Set the DataItems for the Layout.
+ ///
+ private DataItems GetData()
+ {
+ DataItems ItemsInfo = new DataItems();
+
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "1",
+ Name = "Start",
+ Text = "1",
+ });
+
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "2",
+ Name = "Invoice Entry",
+ ParentId = new List { "1" },
+ Text = "1",
+ });
+
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "3",
+ Name = "Confirm Payment Received",
+ ParentId = new List { "1" },
+ BranchDirection = "Right",
+ Text = "1",
+ });
+
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "4",
+
+ Name = "Check Customer Payment",
+ ParentId = new List { "2" },
+ Text = "1",
+
+ });
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "5",
+
+ Name = "Credit Memo Entry",
+ ParentId = new List { "4" },
+ Text = "1",
+
+ });
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "6",
+ Name = "Refund Customer",
+ ParentId = new List { "5" },
+ Text = "1",
+
+ });
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "8",
+ Name = "Refund with standard Voucher",
+ ParentId = new List { "3" },
+
+ Text = "5",
+
+ });
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "9",
+ Name = "Complete Payment Customer Memo",
+ ParentId = new List { "8" },
+ Text = "5",
+
+ });
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "10",
+ Name = "Reject",
+ ParentId = new List { "9" },
+ BranchDirection = "Right",
+ Text = "4",
+
+ });
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "11",
+ Name = "Approve Invoice",
+ ParentId = new List { "9" },
+ Text = "5",
+
+ });
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "12",
+ Name = "Credit Memo Creation",
+ ParentId = new List { "11" },
+ Text = "1",
+
+
+ });
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "13",
+ Name = "Fill Credit Memo",
+ ParentId = new List { "12" },
+ Text = "1",
+
+ });
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "14",
+ Name = "Re-Issuing the invoice",
+ ParentId = new List { "13", "6" },
+ BranchDirection = "Left",
+ Text = "1",
+ });
+ ItemsInfo.Add(new ItemInfo()
+ {
+ Id = "15",
+ Name = "End",
+ ParentId = new List { "14" },
+ Text = "4",
+ });
+ return ItemsInfo;
+ }
+
+ ///
+ /// Set Level for each nodes to render them based on the level used to position the nodes.
+ ///
+ private void SetLevelForNodeData()
+ {
+ foreach (ItemInfo parentItem in diagram.CustomData as IEnumerable)
+ {
+ if ((parentItem as ItemInfo).ParentId == null)
+ {
+ (parentItem as ItemInfo).level = "Root";
+ }
+ else
+ {
+ foreach (var parent in (parentItem as ItemInfo).ParentId)
+ {
+ foreach (ItemInfo childItem in diagram.CustomData as IEnumerable)
+ {
+ if ((childItem as ItemInfo).Id == parent)
+ {
+ if ((childItem as ItemInfo).level == "Root")
+ {
+ (parentItem as ItemInfo).level = "Level1";
+ }
+ else
+ {
+ string substring = (childItem as ItemInfo).level.Substring(5);
+ int substringvalue = int.Parse(substring);
+ substringvalue += 1;
+ (parentItem as ItemInfo).level = "Level" + substringvalue.ToString();
+
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ ///
+ /// Create Node based on the Data.
+ ///
+ private void CreateDiagramUsingData()
+ {
+ foreach (ItemInfo item in diagram.CustomData as IEnumerable)
+ {
+ NodeViewModel node = new NodeViewModel()
+ {
+ UnitHeight = 60,
+ UnitWidth = 250,
+ Content = item,
+ };
+
+ if (node != null)
+ {
+ if ((node.Content as ItemInfo).Id.Equals("1") || (node.Content as ItemInfo).Id.ToString().Equals("15"))
+ {
+ //Updating content template to the start and end nodes
+ node.ContentTemplate = Application.Current.MainWindow.Resources["EllipseNodeContentTemplate"] as DataTemplate;
+ }
+ else
+ {
+ //Updating content template to the node
+
+ node.ContentTemplate = Application.Current.MainWindow.Resources["newCretedNode"] as DataTemplate;
+ }
+ }
+
+ (diagram.Nodes as NodeCollection).Add(node);
+ }
+ }
+
+ ///
+ /// Update the positions for the nodes
+ ///
+ private void UpdatePosition()
+ {
+ foreach(NodeViewModel node in diagram.Nodes as IEnumerable)
+ {
+ if ((node.Content as ItemInfo).ParentId == null)
+ {
+ node.OffsetX = diagram.ViewPortCentreX;
+ node.OffsetY = diagram.ViewPortCentreY + 100;
+ }
+ else
+ {
+
+ foreach (NodeViewModel nodes in diagram.Nodes as IEnumerable)
+ {
+ List ParentIDs = new List();
+ string ParentID = string.Empty;
+ foreach (var parentID in (node.Content as ItemInfo).ParentId)
+ {
+ ParentIDs.Add(int.Parse(parentID.ToString()));
+ ParentID = ParentIDs.Max().ToString();
+ }
+
+ //This condition for update the offset value for the node from the parent node.
+ if (ParentID == ((nodes as NodeViewModel).Content as ItemInfo).Id)
+ {
+ if ((node.Content as ItemInfo).BranchDirection == "Right")
+ {
+ node.OffsetX = (nodes as NodeViewModel).OffsetX + ((nodes as NodeViewModel).UnitWidth / 2) + diagram.HorizontalSpacing + (node.UnitWidth / 2);
+ node.OffsetY = (nodes as NodeViewModel).OffsetY + ((nodes as NodeViewModel).UnitHeight / 2) + diagram.VerticalSpacing + (node.UnitHeight / 2);
+ }
+ else if ((node.Content as ItemInfo).BranchDirection == "Left")
+ {
+ node.OffsetX = (nodes as NodeViewModel).OffsetX - ((nodes as NodeViewModel).UnitWidth / 2) - diagram.HorizontalSpacing - (node.UnitWidth / 2);
+ node.OffsetY = (nodes as NodeViewModel).OffsetY + ((nodes as NodeViewModel).UnitHeight / 2) + diagram.VerticalSpacing + (node.UnitHeight / 2);
+ }
+ else
+ {
+ node.OffsetX = (nodes as NodeViewModel).OffsetX;
+ node.OffsetY = (nodes as NodeViewModel).OffsetY + ((nodes as NodeViewModel).UnitHeight / 2) + diagram.VerticalSpacing + (node.UnitHeight / 2);
+ }
+ }
+ }
+ }
+
+ }
+ }
+
+ ///
+ /// Create the connection between the nodes
+ ///
+ private void CreateConnection()
+ {
+ foreach (NodeViewModel node in diagram.Nodes as IEnumerable)
+ {
+ node.ID = (node.Content as ItemInfo).Id;
+ if ((node.Content as ItemInfo).ParentId != null)
+ {
+ foreach (var ParentID in (node.Content as ItemInfo).ParentId)
+ {
+ ConnectorViewModel nodeToNodeConnection = new ConnectorViewModel()
+ {
+
+ SourceNodeID = ParentID,
+ TargetNodeID = (node.Content as ItemInfo).Id,
+ Annotations = new ObservableCollection()
+ {
+ new AnnotationEditorViewModel()
+ {
+ Content="1"
+ }
+ }
+ };
+
+ (diagram.Connectors as ConnectorCollection).Add(nodeToNodeConnection);
+
+ }
+ }
+ }
+ }
+
+ #endregion
+ }
+
+ public class CustomDiagram : SfDiagram
+ {
+ private DataItems _customData;
+ private double _horizontalSpacing = 60;
+ private double _verticalSpacing = 100;
+ private double _viewPortCentreX = 0;
+ private double _viewPortCentreY = 0;
+
+ public DataItems CustomData
+ {
+ get
+ {
+ return _customData;
+ }
+ set
+ {
+ _customData = value;
+ OnPropertyChanged(nameof(CustomData));
+ }
+ }
+
+
+
+ public double HorizontalSpacing
+ {
+ get
+ {
+ return _horizontalSpacing;
+ }
+ set
+ {
+ _horizontalSpacing = value;
+ OnPropertyChanged(nameof(HorizontalSpacing));
+ }
+ }
+
+ public double VerticalSpacing
+ {
+ get
+ {
+ return _verticalSpacing;
+ }
+ set
+ {
+ _verticalSpacing = value;
+ OnPropertyChanged(nameof(VerticalSpacing));
+ }
+ }
+
+ public double ViewPortCentreX
+ {
+ get
+ {
+ return _viewPortCentreX;
+ }
+ set
+ {
+ _viewPortCentreX = value;
+ OnPropertyChanged(nameof(ViewPortCentreX));
+ }
+ }
+
+ public double ViewPortCentreY
+ {
+ get
+ {
+ return _viewPortCentreY;
+ }
+ set
+ {
+ _viewPortCentreY = value;
+ OnPropertyChanged(nameof(ViewPortCentreY));
+ }
+ }
+ }
+}
+
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Model/ItemInfo.cs b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Model/ItemInfo.cs
new file mode 100644
index 00000000..68f54ee9
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Model/ItemInfo.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace CustomDataSource.Model
+{
+ public class ItemInfo
+ {
+ private string _shape;
+ private double _width = 250;
+ private double _height = 60;
+ public ItemInfo()
+ {
+
+ }
+
+ public string Id { get; set; }
+ public string Name { get; set; }
+
+ public string Label { get; set; }
+ public List ParentId { get; set; }
+ public string _Shape {
+ get
+ {
+ return _shape;
+ }
+ set
+ {
+ _shape = value;
+
+ }
+ }
+ public double Height
+ {
+ get
+ {
+ return _height;
+ }
+ set { _height = value; }
+ }
+ public double Width
+ {
+ get
+ {
+ return _width;
+ }
+ set { _width = value; }
+ }
+
+ public string level { get; set; }
+
+ public string BranchDirection { get; set; }
+ public object Text { get; set; }
+ }
+ public class DataItems : ObservableCollection
+ {
+
+ }
+}
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/NodeCreate.xaml b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/NodeCreate.xaml
new file mode 100644
index 00000000..1f8d0721
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/NodeCreate.xaml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/NodeCreate.xaml.cs b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/NodeCreate.xaml.cs
new file mode 100644
index 00000000..df7e93af
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/NodeCreate.xaml.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace CustomDataSource
+{
+ ///
+ /// Interaction logic for NodeCreate.xaml
+ ///
+ public partial class NodeCreate : UserControl
+ {
+ public NodeCreate()
+ {
+ InitializeComponent();
+ var ellipseBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4382FF"));
+ var ellipsesCount = 4;
+ var initialEllipseDiameter = 70;
+ var diameterStep = 25;
+ var opacityStep = 1d / ellipsesCount;
+
+ for (int i = 0; i < ellipsesCount; i++)
+ {
+ var size = initialEllipseDiameter + (diameterStep * i);
+ var ellipse = new Ellipse()
+ {
+ Width = size,
+ Height = size,
+ Fill = new SolidColorBrush(ellipseBrush.Color) { Opacity = 1 - (i * opacityStep) }
+ };
+ ellipsesPanel.Children.Insert(0, ellipse);
+ }
+
+ var ellipsesWidth = ellipsesPanel.Children.OfType().Max(x => x.Width);
+ var offset = (ellipsesWidth / 2) - (mainEllipse.Width / 2);
+ Canvas.SetLeft(ellipsesPanel, -offset);
+ Canvas.SetTop(ellipsesPanel, -offset);
+ }
+ }
+}
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/AssemblyInfo.cs b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..18f88f86
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+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("CustomDataSource")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("CustomDataSource")]
+[assembly: AssemblyCopyright("Copyright © 2024")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//CultureYouAreCodingWith in your .csproj file
+//inside a . For example, if you are using US english
+//in your source files, set the to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Resources.Designer.cs b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..09b5c605
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace CustomDataSource.Properties
+{
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CustomDataSource.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Resources.resx b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Resources.resx
new file mode 100644
index 00000000..af7dbebb
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Settings.Designer.cs b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Settings.Designer.cs
new file mode 100644
index 00000000..432e5526
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace CustomDataSource.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Settings.settings b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Settings.settings
new file mode 100644
index 00000000..033d7a5e
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/packages.config b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/packages.config
new file mode 100644
index 00000000..97a733cc
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/CustomDataSource/CustomDataSource/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/DataSource/Custom Layout Algorithm/README.md b/Samples/DataSource/Custom Layout Algorithm/README.md
new file mode 100644
index 00000000..3fa5c49b
--- /dev/null
+++ b/Samples/DataSource/Custom Layout Algorithm/README.md
@@ -0,0 +1,13 @@
+# Flowchart Layout sample
+This sample demonstrate how to create a simple diagram using custom layout algorithm
+
+__*Documentation*__: https://help.syncfusion.com/wpf/diagram/automatic-layouts#flowchart-layout
+
+## Project pre-requisites
+To run this application, you need to have the below two in your system
+
+* [Visual Studio 2019](https://www.visualstudio.com/wpf-vs)
+* [Syncfusion.SfDiagram.WPF](https://www.nuget.org/packages/Syncfusion.SfDiagram.WPF/) nuget package. To install the package using NuGet Package Manager, refer this [link](https://docs.microsoft.com/en-us/nuget/quickstart/install-and-use-a-package-in-visual-studio#nuget-package-manager).
+
+## Deploying and running the sample
+* To debug the sample and then run it, press F5 or select Debug > Start Debugging. To run the sample without debugging, press Ctrl+F5 or selectDebug > Start Without Debugging.
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample.sln b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample.sln
new file mode 100644
index 00000000..7e4e7114
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample.sln
@@ -0,0 +1,36 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.8.34309.116
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NodeConnectorSample", "NodeConnectorSample\NodeConnectorSample.csproj", "{5D9EFDC9-A075-4C73-B01A-DC8909FF37D8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Syncfusion.SfDiagram.WPF_2017", "..\..\..\Desktop\WPFSource\sfdiagram-xaml\WPF\SfDiagram.WPF\Src\Syncfusion.SfDiagram.WPF_2017.csproj", "{E18CFD68-5392-4AFF-BF84-6C7EC1745AC0}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ Release-Xml|Any CPU = Release-Xml|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5D9EFDC9-A075-4C73-B01A-DC8909FF37D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5D9EFDC9-A075-4C73-B01A-DC8909FF37D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5D9EFDC9-A075-4C73-B01A-DC8909FF37D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5D9EFDC9-A075-4C73-B01A-DC8909FF37D8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5D9EFDC9-A075-4C73-B01A-DC8909FF37D8}.Release-Xml|Any CPU.ActiveCfg = Release|Any CPU
+ {5D9EFDC9-A075-4C73-B01A-DC8909FF37D8}.Release-Xml|Any CPU.Build.0 = Release|Any CPU
+ {E18CFD68-5392-4AFF-BF84-6C7EC1745AC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E18CFD68-5392-4AFF-BF84-6C7EC1745AC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E18CFD68-5392-4AFF-BF84-6C7EC1745AC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E18CFD68-5392-4AFF-BF84-6C7EC1745AC0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E18CFD68-5392-4AFF-BF84-6C7EC1745AC0}.Release-Xml|Any CPU.ActiveCfg = Release-Xml|Any CPU
+ {E18CFD68-5392-4AFF-BF84-6C7EC1745AC0}.Release-Xml|Any CPU.Build.0 = Release-Xml|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {B97C6767-FAED-43F2-ADC6-39BC1565B93B}
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/App.config b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/App.config
new file mode 100644
index 00000000..b50c74f3
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/App.xaml b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/App.xaml
new file mode 100644
index 00000000..3584d864
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/App.xaml.cs b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/App.xaml.cs
new file mode 100644
index 00000000..6c0439e7
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/App.xaml.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace NodeConnectorSample
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ }
+}
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/MainWindow.xaml b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/MainWindow.xaml
new file mode 100644
index 00000000..89991f4c
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/MainWindow.xaml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/MainWindow.xaml.cs b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/MainWindow.xaml.cs
new file mode 100644
index 00000000..c7b49371
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/MainWindow.xaml.cs
@@ -0,0 +1,67 @@
+using Syncfusion.UI.Xaml.Diagram;
+using Syncfusion.UI.Xaml.Diagram.Controls;
+
+using Syncfusion.UI.Xaml.Diagram.Utility;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using System.Xml.Linq;
+//using Node = Syncfusion.UI.Xaml.Diagram.Node;
+
+namespace NodeConnectorSample
+{
+ ///
+ /// Interaction logic for MainWindow.xaml
+ ///
+ public partial class MainWindow : Window
+ {
+ public MainWindow()
+ {
+ InitializeComponent();
+
+ //Here diagram is the instance of the SfDiagram.
+ //Adding MouseMove Event
+ diagram.MouseMove += Diagram_MouseMove;
+ }
+
+
+ ///
+ /// Method for executing MouseMoveEvent
+ ///
+
+ private void Diagram_MouseMove(object sender, MouseEventArgs e)
+ {
+ //Caste the e.OriginalSource as Dependency Object.
+ DependencyObject source = e.OriginalSource as DependencyObject;
+
+ // Find the Visual Parent for Node
+ var node = source.FindVisualParent();
+
+ //Find the Visual Parnet for connector
+ var connector = source.FindVisualParent();
+
+
+ if ((node != null))
+ {
+ //Get the NodeViewModel from the node.
+ NodeViewModel nodeVM = node.DataContext as NodeViewModel;
+ }
+ if(connector != null)
+ {
+ //Get the ConnectorViewModel from the connector
+ ConnectorViewModel connectorVM = connector.DataContext as ConnectorViewModel;
+ }
+ }
+ }
+}
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/NodeConnectorSample.csproj b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/NodeConnectorSample.csproj
new file mode 100644
index 00000000..8abc8dd2
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/NodeConnectorSample.csproj
@@ -0,0 +1,111 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {5D9EFDC9-A075-4C73-B01A-DC8909FF37D8}
+ WinExe
+ NodeConnectorSample
+ NodeConnectorSample
+ v4.6.2
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\Syncfusion.Licensing.25.1.35\lib\net462\Syncfusion.Licensing.dll
+
+
+ ..\packages\Syncfusion.Shared.WPF.25.1.35\lib\net462\Syncfusion.Shared.WPF.dll
+
+
+
+
+
+
+
+
+
+
+ 4.0
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+ App.xaml
+ Code
+
+
+ MainWindow.xaml
+ Code
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
+ {e18cfd68-5392-4aff-bf84-6c7ec1745ac0}
+ Syncfusion.SfDiagram.WPF_2017
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/AssemblyInfo.cs b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..dd0f9b9f
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+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("NodeConnectorSample")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("NodeConnectorSample")]
+[assembly: AssemblyCopyright("Copyright © 2024")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//CultureYouAreCodingWith in your .csproj file
+//inside a . For example, if you are using US english
+//in your source files, set the to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Resources.Designer.cs b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..bbd5d7fd
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace NodeConnectorSample.Properties
+{
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NodeConnectorSample.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Resources.resx b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Resources.resx
new file mode 100644
index 00000000..af7dbebb
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Settings.Designer.cs b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Settings.Designer.cs
new file mode 100644
index 00000000..7dd682b2
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace NodeConnectorSample.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Settings.settings b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Settings.settings
new file mode 100644
index 00000000..033d7a5e
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/packages.config b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/packages.config
new file mode 100644
index 00000000..acef62f8
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/NodeConnectorSample/NodeConnectorSample/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Node/Sample-for-GetNode/README.md b/Samples/Node/Sample-for-GetNode/README.md
new file mode 100644
index 00000000..cb80b2b3
--- /dev/null
+++ b/Samples/Node/Sample-for-GetNode/README.md
@@ -0,0 +1,14 @@
+# How to get the node or connector in the MouseMove event in WPF Diagram (SfDiagram)?
+
+This repository contains sample which shows how to get the node or connector in the MouseMove Event.
+
+__*Documentation*__: https://help.syncfusion.com/wpf/diagram/node
+
+## Project pre-requisites
+To run this application, you need to have the below two in your system
+
+* [Visual Studio 2019](https://www.visualstudio.com/wpf-vs)
+* [Syncfusion.SfDiagram.WPF](https://www.nuget.org/packages/Syncfusion.SfDiagram.WPF/) nuget package. To install the package using NuGet Package Manager, refer this [link](https://docs.microsoft.com/en-us/nuget/quickstart/install-and-use-a-package-in-visual-studio#nuget-package-manager).
+
+## Deploying and running the sample
+* To debug the sample and then run it, press F5 or select Debug > Start Debugging. To run the sample without debugging, press Ctrl+F5 or selectDebug > Start Without Debugging.
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton.sln b/Samples/Panning/MouseMiddleButton/MouseMiddleButton.sln
new file mode 100644
index 00000000..669277b7
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.8.34309.116
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MouseMiddleButton", "MouseMiddleButton\MouseMiddleButton.csproj", "{CFF327B6-3997-41FB-831F-D6621EBDAE9D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {CFF327B6-3997-41FB-831F-D6621EBDAE9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CFF327B6-3997-41FB-831F-D6621EBDAE9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CFF327B6-3997-41FB-831F-D6621EBDAE9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CFF327B6-3997-41FB-831F-D6621EBDAE9D}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {0D45BFE5-D546-4847-A9AF-2AFBAAE1C484}
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/App.config b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/App.config
new file mode 100644
index 00000000..b50c74f3
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/App.xaml b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/App.xaml
new file mode 100644
index 00000000..ed661c48
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/App.xaml.cs b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/App.xaml.cs
new file mode 100644
index 00000000..d1c4828c
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/App.xaml.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace MouseMiddleButton
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ }
+}
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/MainWindow.xaml b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/MainWindow.xaml
new file mode 100644
index 00000000..0bab8a29
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/MainWindow.xaml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/MainWindow.xaml.cs b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/MainWindow.xaml.cs
new file mode 100644
index 00000000..629346bb
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/MainWindow.xaml.cs
@@ -0,0 +1,100 @@
+using Syncfusion.UI.Xaml.Diagram;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace MouseMiddleButton
+{
+ ///
+ /// Interaction logic for MainWindow.xaml
+ ///
+ public partial class MainWindow : Window
+ {
+ //To hold the initial location to process pan action.
+ Point InitialLocation = new Point();
+ public MainWindow()
+ {
+ InitializeComponent();
+ diagram.PreviewMouseMove += Diagram_PreviewMouseMove;
+ diagram.PreviewMouseWheel += Diagram_PreviewMouseWheel;
+ diagram.PreviewMouseDown += Diagram_PreviewMouseDown;
+ }
+
+ private void Diagram_PreviewMouseDown(object sender, MouseButtonEventArgs e)
+ {
+ //Getting mouse initial location when middle button pressed down.
+ InitialLocation = e.GetPosition(diagram.Page);
+ //Disabling intelli mouse wheel action when pressing middle button.
+ if (e.MiddleButton == MouseButtonState.Pressed)
+ {
+ e.Handled = true;
+ }
+ }
+ private void Diagram_PreviewMouseMove(object sender, MouseEventArgs e)
+ {
+ //Getting current mouse point position of diagram..
+
+ Point currentMousePoint = e.GetPosition(diagram.Page);
+
+ Point panDelta = new Point(currentMousePoint.X - InitialLocation.X, currentMousePoint.Y - InitialLocation.Y);
+
+ if (e.MiddleButton == MouseButtonState.Pressed)
+ {
+
+ //Disabling intelli mouse wheel action when pressing middle button.
+
+ e.Handled = true;
+
+ //Getting current zoom scale value.
+
+ double currentZoomLevel = diagram.ScrollSettings.ScrollInfo.CurrentZoom;
+
+ //Translating pan delta changes to current zoom scale value.
+
+ panDelta.X = panDelta.X * currentZoomLevel;
+
+ panDelta.Y = panDelta.Y * currentZoomLevel;
+
+ //setting hand cursor for panning action
+
+ Mouse.SetCursor(Cursors.Hand);
+
+ //Executing pan process when middle mouse button moving.
+
+ (diagram.Info as IGraphInfo).Commands.Zoom.Execute(new ZoomPositionParameter() { ZoomCommand = ZoomCommand.Pan, PanDelta = panDelta });
+
+ }
+ }
+ private void Diagram_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
+ {
+ ScrollSettings scrollSettings = diagram.ScrollSettings;
+ //to skip the zooming operation when control+mouse scroll is used
+ if (Keyboard.Modifiers == ModifierKeys.Control || scrollSettings == null || scrollSettings.ScrollInfo == null)
+ return;
+ //current mouse position
+ double focusX = e.GetPosition(diagram.Page).X;
+ double focusY = e.GetPosition(diagram.Page).Y;
+ ZoomCommand zoomCommand = e.Delta > 0 ? ZoomCommand.ZoomIn : ZoomCommand.ZoomOut;
+ (diagram.Info as IGraphInfo).Commands.Zoom.Execute(new ZoomPositionParameter
+ {
+ ZoomCommand = zoomCommand,
+ ZoomFactor = 0.2,
+ //to zoom the page with currnet mouse position as a center
+ FocusPoint = new Point(focusX, focusY),
+ });
+ //Disabling the zooming action when pressing control and mouse wheel.
+ e.Handled = true;
+ }
+ }
+}
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/MouseMiddleButton.csproj b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/MouseMiddleButton.csproj
new file mode 100644
index 00000000..632f5387
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/MouseMiddleButton.csproj
@@ -0,0 +1,108 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {CFF327B6-3997-41FB-831F-D6621EBDAE9D}
+ WinExe
+ MouseMiddleButton
+ MouseMiddleButton
+ v4.6.2
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\Syncfusion.Licensing.25.1.35\lib\net462\Syncfusion.Licensing.dll
+
+
+ ..\packages\Syncfusion.SfDiagram.WPF.25.1.35\lib\net462\Syncfusion.SfDiagram.WPF.dll
+
+
+ ..\packages\Syncfusion.Shared.WPF.25.1.35\lib\net462\Syncfusion.Shared.WPF.dll
+
+
+
+
+
+
+
+
+
+
+ 4.0
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+ App.xaml
+ Code
+
+
+ MainWindow.xaml
+ Code
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/AssemblyInfo.cs b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..6fada430
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+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("MouseMiddleButton")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("MouseMiddleButton")]
+[assembly: AssemblyCopyright("Copyright © 2024")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//CultureYouAreCodingWith in your .csproj file
+//inside a . For example, if you are using US english
+//in your source files, set the to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Resources.Designer.cs b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..2946b6db
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace MouseMiddleButton.Properties
+{
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MouseMiddleButton.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Resources.resx b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Resources.resx
new file mode 100644
index 00000000..af7dbebb
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Settings.Designer.cs b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Settings.Designer.cs
new file mode 100644
index 00000000..79ff7071
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace MouseMiddleButton.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Settings.settings b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Settings.settings
new file mode 100644
index 00000000..033d7a5e
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Panning/MouseMiddleButton/MouseMiddleButton/packages.config b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/packages.config
new file mode 100644
index 00000000..acef62f8
--- /dev/null
+++ b/Samples/Panning/MouseMiddleButton/MouseMiddleButton/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/Panning/README.md b/Samples/Panning/README.md
new file mode 100644
index 00000000..7b6c0f1c
--- /dev/null
+++ b/Samples/Panning/README.md
@@ -0,0 +1,14 @@
+# MouseMiddleButton sample
+
+This sample demonstrates how to pan and scroll the diagram using mouse middle button.
+
+__*Documentation*__: https://help.syncfusion.com/wpf/diagram/page-settings
+
+## Project pre-requisites
+To run this application, you need to have the below two in your system
+
+* [Visual Studio 2019](https://www.visualstudio.com/wpf-vs)
+* [Syncfusion.SfDiagram.WPF](https://www.nuget.org/packages/Syncfusion.SfDiagram.WPF/) nuget package. To install the package using NuGet Package Manager, refer this [link](https://docs.microsoft.com/en-us/nuget/quickstart/install-and-use-a-package-in-visual-studio#nuget-package-manager).
+
+## Deploying and running the sample
+* To debug the sample and then run it, press F5 or select Debug > Start Debugging. To run the sample without debugging, press Ctrl+F5 or selectDebug > Start Without Debugging.