Category / Section
How to detect the close event for non-document controls in SfDockingManager
This article describes how to detect close event for non-document controls in SfDockingManager.
Triggered the Close Button Click event to detect the non-document windows which are closed in SfDockingManager.
The following code example demonstrates the same.
XAML
<navigation:SfDockingManager x:Name="docking" LayoutUpdated="docking_LayoutUpdated"> <ContentControl navigation:SfDockingManager.Header="ToolBox" navigation:SfDockingManager.DesiredWidthInDockedMode="300"/> <ContentControl navigation:SfDockingManager.Header="Mainpage.xaml" navigation:SfDockingManager.DockState="Document"/> <ContentControl navigation:SfDockingManager.Header="App.xaml" navigation:SfDockingManager.DockState="Document"/> <ContentControl navigation:SfDockingManager.Header="Solution Explorer" navigation:SfDockingManager.DesiredWidthInDockedMode="300" navigation:SfDockingManager.SideInDockedMode="Right"/> <ContentControl navigation:SfDockingManager.Header="Output" navigation:SfDockingManager.SideInDockedMode="Bottom" navigation:SfDockingManager.DesiredHeightInDockedMode="200"/> </navigation:SfDockingManager>
C#
public partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private void Win_Loaded(object sender, RoutedEventArgs e)
{
foreach (ToggleButton btn in FindVisualChildrenOfType<ToggleButton>(sender as DockWindow))
{
if (btn.Name == "PART_CloseButton")
{
btn.Click -= Btn_Click;
btn.Click += Btn_Click;
}
}
(sender as DockWindow).Loaded -= Win_Loaded;
}
private async void Btn_Click(object sender, RoutedEventArgs e)
{
MessageDialog dialog = new MessageDialog("Closed : " + SfDockingManager.GetHeader(docking.ActiveWindow));
await dialog.ShowAsync();
}
public static IEnumerable<T> FindVisualChildrenOfType<T>(DependencyObject parent) where T : DependencyObject
{
List<T> foundChildren = new List<T>();
int childCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childCount; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
T childType = child as T;
if (childType == null)
{
foreach (var other in FindVisualChildrenOfType<T>(child))
yield return other;
}
else
{
yield return (T)child;
}
}
}
private void docking_LayoutUpdated(object sender, object e)
{
foreach (DockWindow win in FindVisualChildrenOfType<DockWindow>(docking))
{
if (win != null)
{
win.Loaded -= Win_Loaded;
win.Loaded += Win_Loaded;
}
}
}
}
The output for the above code is shown below:
