Déposer une fenêtre dans une autre fenêtre

Mon événement

private void Window_Drop(object sender, DragEventArgs e) { var window = e.Data.GetData(typeof(Window)) as Window; if (window != null) { var tabitem = new TabItem(); tabitem.Content = window.Content; tabcontrol1.Items.Add(tabitem); window.Close(); } } 

Mon fenêtre principale XAML

   

Rien ne se passe, aucune idée pourquoi?

Comment puis-je déposer une fenêtre de mon application dans la fenêtre principale?

pour démontrer ce que j’essaie de faire entrez la description de l'image ici les tabitem5 et tabitem2 ont été déplacés en dehors de la fenêtre principale et sont ainsi devenus des fenêtres indépendantes; maintenant, j’essaie d’inverser le processus et de les transformer en tabs en les faisant glisser jusqu’à la fenêtre principale.

Je donne la prime pour un échantillon de code complet, onglet pour fenêtre et fenêtre pour onglet, une solution MVVM est acceptable aussi

On dirait que vous essayez de mettre en place un système d’accueil. Avez-vous jeté un coup d’œil aux gestionnaires d’amarrage existants?

Avalon Dock est un excellent exemple Open Source. C’est bien documenté et facile à utiliser.

Si vous êtes déterminé à mettre en œuvre la vôtre, vous pouvez essayer de trouver une fenêtre sous celle que vous faites glisser. Malheureusement, WPF n’a pas de moyen facile de HitTest sous Windows. La solution consiste à faire des appels Win32. Le code utilisé provient d’un autre fil SO ici , par Ray Burns, et d’un appel Win32 pour obtenir la position actuelle de la souris , par Fredrik Hedblad .

J’ai également utilisé WindowStyle="None" et implémenté une barre de titre personnalisée pour la fenêtre afin que je puisse capturer des événements de souris dans la fenêtre.

Je ne suis pas tout à fait sûr de savoir comment vous avez implémenté l’onglet en faisant glisser pour créer une nouvelle fenêtre, mais si cela fonctionne, vous pouvez procéder comme suit.

XAML

        

Code

 public partial class DraggedWindow : Window { private readonly MainWindow _mainWindow; private bool _isDropped = false; public DraggedWindow(MainWindow mainWindow) { _mainWindow = mainWindow; InitializeComponent(); DataContext = new TabItem() { Header = "TabItem6", Content = "Content6" }; } const uint GW_HWNDNEXT = 2; [DllImport("User32")] static extern IntPtr GetTopWindow(IntPtr hWnd); [DllImport("User32")] static extern IntPtr GetWindow(IntPtr hWnd, uint wCmd); [DllImport("User32")] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool GetCursorPos(ref Win32Point pt); [StructLayout(LayoutKind.Sequential)] internal struct Win32Point { public Int32 X; public Int32 Y; }; public static Point GetMousePosition() { Win32Point w32Mouse = new Win32Point(); GetCursorPos(ref w32Mouse); return new Point(w32Mouse.X, w32Mouse.Y); } public Window FindWindowUnderThisAt(Point screenPoint) // WPF units (96dpi), not device units { return ( from win in SortWindowsTopToBottom(Application.Current.Windows.OfType()) where new Rect(win.Left, win.Top, win.Width, win.Height).Contains(screenPoint) && !Equals(win, this) select win ).FirstOrDefault(); } public IEnumerable SortWindowsTopToBottom(IEnumerable unsorted) { var byHandle = unsorted.ToDictionary(win => ((HwndSource)PresentationSource.FromVisual(win)).Handle); for (IntPtr hWnd = GetTopWindow(IntPtr.Zero); hWnd != IntPtr.Zero; hWnd = GetWindow(hWnd, GW_HWNDNEXT)) { if (byHandle.ContainsKey(hWnd)) yield return byHandle[hWnd]; } } private void DraggedWindow_OnMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { this.DragMove(); } var absoluteScreenPos = GetMousePosition(); var windowUnder = FindWindowUnderThisAt(absoluteScreenPos); if (windowUnder != null && windowUnder.Equals(_mainWindow)) { if (_isDropped) { // Your code here var tabitem = new TabItem(); tabitem.Content = (DataContext as TabItem).Content; tabitem.Header = (DataContext as TabItem).Header; _mainWindow.TabControl1.Items.Add(tabitem); this.Close(); } } } private void DraggedWindow_OnMouseDown(object sender, MouseButtonEventArgs e) { _isDropped = false; } private void DraggedWindow_OnMouseUp(object sender, MouseButtonEventArgs e) { _isDropped = true; } } 

Fenêtre principale Xaml (exemple)

    Content1 Content2 Content3 Content4 Content5   

Code de la fenêtre principale (exemple)

 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); new DraggedWindow(this).Show(); } }