Porta una finestra in primo piano in WPF


219

Come posso portare la mia applicazione WPF in primo piano sul desktop? Finora ho provato:

SwitchToThisWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle, true);

SetWindowPos(new WindowInteropHelper(Application.Current.MainWindow).Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

SetForegroundWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle);

Nessuno dei quali sta facendo il lavoro ( Marshal.GetLastWin32Error()sta dicendo che queste operazioni sono state completate con successo e gli attributi P / Invoke per ogni definizione lo hanno SetLastError=true).

Se creo una nuova applicazione WPF vuota e chiamo SwitchToThisWindowcon un timer, funziona esattamente come previsto, quindi non sono sicuro del motivo per cui non funziona nel mio caso originale.

Modifica : lo sto facendo in combinazione con un tasto di scelta rapida globale.


Hai verificato che MainWindow è la finestra che desideri? Da MSDN: MainWindow viene impostato automaticamente con un riferimento al primo oggetto Window di cui creare un'istanza in AppDomain.
Todd White

Buona idea, ma è l'unica finestra dell'applicazione.
Factor Mystic

Puoi fornire un po 'più di codice di contesto?
Todd White,

Risposte:


320
myWindow.Activate();

Tenta di portare la finestra in primo piano e di attivarla.

Questo dovrebbe funzionare, a meno che io non abbia capito male e tu desideri un comportamento Sempre in primo piano. In tal caso vuoi:

myWindow.TopMost = true;

15
Stavo semplicemente usando myWindow.Show () ea volte non era in cima. Subito dopo ho chiamato myWindow.Activate () e ha funzionato.
Bermo

4
L'attivazione a volte non funziona su Windows XP. Raccomando la risposta di @Matthew Xavier.
Lex Li

Un po 'strano, dato che per impostazione predefinita ShowActivated è attivo.
greenoldman

1
La prima risposta è buona, grazie per questo! Ma la seconda riga di codice, l'utilizzo della Topmostproprietà è una cattiva pratica poiché può oscurare altre finestre di dialogo popup e avere un comportamento imprevisto.
Jonathan Perry

3
In realtà si può fare con questo: if (myWindow.WindowState == WindowState.Minimized) myWindow.WindowState = WindowState.Normal;stranamente preserverà anche tutte le finestre ingrandite e non le ripristinerà allo stato normale.
R41 il

176

Ho trovato una soluzione che porta la finestra in alto, ma si comporta come una normale finestra:

if (!Window.IsVisible)
{
    Window.Show();
}

if (Window.WindowState == WindowState.Minimized)
{
    Window.WindowState = WindowState.Normal;
}

Window.Activate();
Window.Topmost = true;  // important
Window.Topmost = false; // important
Window.Focus();         // important

1
Ottimo suggerimento! TopMost fa accadere la magia su Windows 7 se la finestra è già aperta, ma sotto le altre finestre.
gsb

Questo ha funzionato anche per me. Grazie a gsb per il commento aggiuntivo su quello che sembra uno strano uso di TopMost!
Jen

1
Grazie - la soluzione è stata breve e dolce.
code4life

2
Nel mio caso Window.Activate () e Window.Focus () erano sufficienti. L'impostazione di Window.TopMost non è necessaria.
virious

6
Non utilizzare Window.Focus(). Ciò distoglierà l'attenzione da ciò che l'utente sta attualmente digitando in una casella di testo, il che è follemente frustrante per gli utenti finali. Il codice sopra funziona perfettamente senza di esso.
Contango

36

Nel caso in cui sia necessario che la finestra sia in primo piano la prima volta che viene caricata, è necessario utilizzare quanto segue:

private void Window_ContentRendered(object sender, EventArgs e)
{
    this.Topmost = false;
}

private void Window_Initialized(object sender, EventArgs e)
{
    this.Topmost = true;
}

1
Se sviluppi qualcosa di simile a Launchy ( launchy.net ) in C #, dovresti notare che questa risposta è quasi inutile.
Lex Li

24

So che questa domanda è piuttosto vecchia, ma mi sono appena imbattuto in questo preciso scenario e volevo condividere la soluzione che ho implementato.

Come accennato nei commenti in questa pagina, molte delle soluzioni proposte non funzionano su XP, che devo supportare nel mio scenario. Anche se sono d'accordo con l'opinione di @Matthew Xavier che generalmente questa è una cattiva pratica di UX, ci sono momenti in cui è del tutto plausibile.

La soluzione per portare una finestra WPF in alto mi è stata effettivamente fornita dallo stesso codice che sto usando per fornire il tasto di scelta rapida globale. Un articolo del blog di Joseph Cooney contiene un collegamento ai suoi esempi di codice che contiene il codice originale.

Ho ripulito e modificato un po 'il codice e l'ho implementato come metodo di estensione per System.Windows.Window. L'ho testato su XP 32 bit e Win7 64 bit, entrambi funzionano correttamente.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Interop;
using System.Runtime.InteropServices;

namespace System.Windows
{
    public static class SystemWindows
    {
        #region Constants

        const UInt32 SWP_NOSIZE = 0x0001;
        const UInt32 SWP_NOMOVE = 0x0002;
        const UInt32 SWP_SHOWWINDOW = 0x0040;

        #endregion

        /// <summary>
        /// Activate a window from anywhere by attaching to the foreground window
        /// </summary>
        public static void GlobalActivate(this Window w)
        {
            //Get the process ID for this window's thread
            var interopHelper = new WindowInteropHelper(w);
            var thisWindowThreadId = GetWindowThreadProcessId(interopHelper.Handle, IntPtr.Zero);

            //Get the process ID for the foreground window's thread
            var currentForegroundWindow = GetForegroundWindow();
            var currentForegroundWindowThreadId = GetWindowThreadProcessId(currentForegroundWindow, IntPtr.Zero);

            //Attach this window's thread to the current window's thread
            AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, true);

            //Set the window position
            SetWindowPos(interopHelper.Handle, new IntPtr(0), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);

            //Detach this window's thread from the current window's thread
            AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, false);

            //Show and activate the window
            if (w.WindowState == WindowState.Minimized) w.WindowState = WindowState.Normal;
            w.Show();
            w.Activate();
        }

        #region Imports

        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll")]
        private static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);

        [DllImport("user32.dll")]
        private static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);

        [DllImport("user32.dll")]
        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

        #endregion
    }
}

Spero che questo codice aiuti gli altri che riscontrano questo problema.


Hey lookie là! Ho lottato con questo per mesi! Questo funziona per entrambe le mie situazioni. Eccezionale! (Windows 7 x64)
mdiehl13

In realtà, sembra funzionare solo se faccio questo: App.mainWindow.Show (); SystemWindows.GlobalActivate (App.mainwindow); // Quando rimuovo il primo .show () non porta in primo piano
mdiehl13

+1 per SetWindowPos (), stavo cercando un modo per portare solo la mia finestra in primo piano senza interrompere altre app o rubare il focus. this.Activate () ruba il focus.
prettyvoid

Questo ha funzionato per me, e nel mio caso il punto centrale era rubare la messa a fuoco, come accade quando un utente interagisce con un determinato elemento. quindi grazie mille, questo sembra funzionare in modo coerente! solo chiamare this.Activate()sembra funzionare solo alcune volte.
Peter

21

Per renderlo un rapido copia-incolla -
Usa questo DoOnProcessmetodo di classe per spostare la finestra principale del processo in primo piano (ma non per rubare lo stato attivo da altre finestre)

public class MoveToForeground
{
    [DllImportAttribute("User32.dll")]
    private static extern int FindWindow(String ClassName, String WindowName);

    const int SWP_NOMOVE        = 0x0002;
    const int SWP_NOSIZE        = 0x0001;            
    const int SWP_SHOWWINDOW    = 0x0040;
    const int SWP_NOACTIVATE    = 0x0010;
    [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);

    public static void DoOnProcess(string processName)
    {
        var allProcs = Process.GetProcessesByName(processName);
        if (allProcs.Length > 0)
        {
            Process proc = allProcs[0];
            int hWnd = FindWindow(null, proc.MainWindowTitle.ToString());
            // Change behavior by settings the wFlags params. See http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx
            SetWindowPos(new IntPtr(hWnd), 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOACTIVATE);
        }
    }
}

HTH


6
+1 questa è l'unica risposta che mi è stata utile. Ho un'applicazione con un master e diverse finestre slave mobili. Dopo aver attivato uno di questi, anche tutte le altre finestre dovrebbero essere portate in primo piano. Ma non attivato / ottieni il focus come suggerisce la maggior parte delle risposte: questo è un disastro in quanto rende la finestra attualmente cliccata non selezionabile poiché improvvisamente un'altra finestra ottiene il focus.
stijn

Qualche motivo per non utilizzarlo process.MainWindowHandle?
Sriram Sakthivel

Nel mio caso, non volevo la finestra principale, ma sono d'accordo, ci sono altri modi per ottenere un hWnd. FWIW un HwndSourceoggetto ha funzionato bene.
tobriand

13

Se l'utente sta interagendo con un'altra applicazione, potrebbe non essere possibile portare la tua in primo piano. Come regola generale, un processo può aspettarsi di impostare la finestra in primo piano solo se quel processo è già il processo in primo piano. (Microsoft documenta le limitazioni nella voce SetForegroundWindow () MSDN.) Ciò è dovuto al fatto che:

  1. L'utente "possiede" il primo piano. Ad esempio, sarebbe estremamente fastidioso se un altro programma rubasse il primo piano mentre l'utente sta digitando, interrompendo per lo meno il suo flusso di lavoro e possibilmente causando conseguenze non intenzionali poiché le sue battiture destinate a un'applicazione vengono interpretate erroneamente dall'autore del reato fino a quando non si accorge del cambiamento .
  2. Immagina che ciascuno dei due programmi controlli per vedere se la sua finestra è in primo piano e tenta di impostarla in primo piano se non lo è. Non appena il secondo programma è in esecuzione, il computer diventa inutilizzabile poiché il primo piano rimbalza tra i due ad ogni cambio di attività.

Buon punto. Lo scopo del codice era in combinazione con un tasto di scelta rapida globale, tuttavia, e altre applicazioni lo fanno in qualche modo.
Factor Mystic

Devo usare PInvoke in C # per emulare quanto descritto in questo articolo, codeproject.com/Tips/76427/…
Lex Li

allora perché le finestre di dialogo popup di errore di expression blends rimangono visibili quando passo a visual studio a volte? : - /
Simon_Weaver

Simon, sospetto che i popup di errore che vedi siano finestre "in alto" (una decisione di progettazione che disapprovo). C'è una differenza tra la finestra in primo piano (che riceve l'input dell'utente) e una finestra "in alto" nell'ordine Z. Ogni finestra può rendersi "in alto", il che la colloca in cima a tutte le finestre non in primo piano, ma non dà il focus della tastiera della finestra, ecc. Come fa la finestra in primo piano.
Matthew Xavier

Il trucco fallisce per alcune finestre speciali. Le finestre di Visual Studio e del prompt dei comandi devono avere qualcosa che impedisce ad altre finestre di diventare la finestra in primo piano.
Lex Li

10

Perché alcune delle risposte in questa pagina sono sbagliate!

  • Qualsiasi risposta che usi window.Focus()è sbagliata.

    • Perché? Se viene visualizzato un messaggio di notifica, window.Focus()attirerà l'attenzione lontano da ciò che l'utente sta digitando in quel momento. Questo è incredibilmente frustrante per gli utenti finali, soprattutto se i popup si verificano abbastanza frequentemente.
  • Qualsiasi risposta che usi window.Activate()è sbagliata.

    • Perché? Renderà visibili anche tutte le finestre genitore.
  • Qualsiasi risposta omessa window.ShowActivated = falseè sbagliata.
    • Perché? Allontanerà il focus da un'altra finestra quando il messaggio si apre, il che è molto fastidioso!
  • Qualsiasi risposta che non usi Visibility.Visibleper nascondere / mostrare la finestra è sbagliata.
    • Perché? Se stiamo usando Citrix, se la finestra non è compressa quando è chiusa, lascerà uno strano blocco rettangolare nero sullo schermo. Quindi, non possiamo usare window.Show()e window.Hide().

Essenzialmente:

  • La finestra non dovrebbe allontanare il focus da altre finestre quando si attiva;
  • La finestra non dovrebbe attivare il suo genitore quando viene mostrata;
  • La finestra dovrebbe essere compatibile con Citrix.

Soluzione MVVM

Questo codice è compatibile al 100% con Citrix (nessuna area vuota dello schermo). È testato sia con WPF normale che con DevExpress.

Questa risposta è intesa per qualsiasi caso d'uso in cui vogliamo una piccola finestra di notifica che sia sempre davanti alle altre finestre (se l'utente seleziona questa nelle preferenze).

Se questa risposta sembra più complessa delle altre, è perché è un codice robusto a livello aziendale. Alcune delle altre risposte in questa pagina sono semplici, ma in realtà non funzionano.

XAML: proprietà collegata

Aggiungi questa proprietà allegata a qualsiasi UserControlall'interno della finestra. La proprietà annessa:

  • Attendi che l' Loadedevento venga generato (altrimenti non può cercare l'albero visivo per trovare la finestra padre).
  • Aggiungi un gestore di eventi che assicuri che la finestra sia visibile o meno.

In qualsiasi momento, puoi impostare la finestra in modo che sia in primo piano o meno, capovolgendo il valore della proprietà allegata.

<UserControl x:Class="..."
         ...
         attachedProperties:EnsureWindowInForeground.EnsureWindowInForeground=
             "{Binding EnsureWindowInForeground, Mode=OneWay}">

C # - Metodo di supporto

public static class HideAndShowWindowHelper
{
    /// <summary>
    ///     Intent: Ensure that small notification window is on top of other windows.
    /// </summary>
    /// <param name="window"></param>
    public static void ShiftWindowIntoForeground(Window window)
    {
        try
        {
            // Prevent the window from grabbing focus away from other windows the first time is created.
            window.ShowActivated = false;

            // Do not use .Show() and .Hide() - not compatible with Citrix!
            if (window.Visibility != Visibility.Visible)
            {
                window.Visibility = Visibility.Visible;
            }

            // We can't allow the window to be maximized, as there is no de-maximize button!
            if (window.WindowState == WindowState.Maximized)
            {
                window.WindowState = WindowState.Normal;
            }

            window.Topmost = true;
        }
        catch (Exception)
        {
            // Gulp. Avoids "Cannot set visibility while window is closing".
        }
    }

    /// <summary>
    ///     Intent: Ensure that small notification window can be hidden by other windows.
    /// </summary>
    /// <param name="window"></param>
    public static void ShiftWindowIntoBackground(Window window)
    {
        try
        {
            // Prevent the window from grabbing focus away from other windows the first time is created.
            window.ShowActivated = false;

            // Do not use .Show() and .Hide() - not compatible with Citrix!
            if (window.Visibility != Visibility.Collapsed)
            {
                window.Visibility = Visibility.Collapsed;
            }

            // We can't allow the window to be maximized, as there is no de-maximize button!
            if (window.WindowState == WindowState.Maximized)
            {
                window.WindowState = WindowState.Normal;
            }

            window.Topmost = false;
        }
        catch (Exception)
        {
            // Gulp. Avoids "Cannot set visibility while window is closing".
        }
    }
}

Utilizzo

Per usarlo, devi creare la finestra nel tuo ViewModel:

private ToastView _toastViewWindow;
private void ShowWindow()
{
    if (_toastViewWindow == null)
    {
        _toastViewWindow = new ToastView();
        _dialogService.Show<ToastView>(this, this, _toastViewWindow, true);
    }
    ShiftWindowOntoScreenHelper.ShiftWindowOntoScreen(_toastViewWindow);
    HideAndShowWindowHelper.ShiftWindowIntoForeground(_toastViewWindow);
}

private void HideWindow()
{
    if (_toastViewWindow != null)
    {
        HideAndShowWindowHelper.ShiftWindowIntoBackground(_toastViewWindow);
    }
}

Link aggiuntivi

Per suggerimenti su come garantire che una finestra di notifica torni sempre sullo schermo visibile, vedere la mia risposta: In WPF, come spostare una finestra sullo schermo se è fuori dallo schermo? .


5
"Codice di livello aziendale" e poche righe dopo catch (Exception) { }. Sì, giusto ... E utilizza un codice che non è nemmeno mostrato nella risposta come _dialogServiceo ShiftWindowOntoScreenHelper. Inoltre chiedendo di creare la finestra in viewmodel side (che fondamentalmente interrompe l'intero pattern MVVM) ...
Kryptos

@ Kryptos Questo è il codice di livello aziendale. L'ho digitato a memoria e questa tecnica esatta viene utilizzata in una grande azienda FTSE100. La vita reale è un po 'meno incontaminata rispetto ai modelli di design perfetti a cui tutti miriamo.
Contango

Non mi piace il fatto che teniamo io stesso un'istanza della finestra nel modello di visualizzazione, come ha detto Kryptos che rompe l'intero punto di mvvm, forse avrebbe potuto essere fatto in codebehind invece?
Igor Meszaros

1
@Igor Meszaros d'accordo. Ora che ho più esperienza, se dovessi farlo di nuovo, aggiungerei un comportamento e lo controllerei utilizzando un Func<>associato al ViewModel.
Contango

9

So che questa è una risposta tardiva, forse utile per i ricercatori

 if (!WindowName.IsVisible)
 {
     WindowName.Show();
     WindowName.Activate();
 }

7

Ho avuto un problema simile con un'applicazione WPF che viene richiamata da un'applicazione Access tramite l'oggetto Shell.

La mia soluzione è di seguito: funziona in XP e Win7 x64 con l'app compilata per la destinazione x86.

Preferisco di gran lunga farlo piuttosto che simulare un alt-tab.

void Window_Loaded(object sender, RoutedEventArgs e)
{
    // make sure the window is normal or maximised
    // this was the core of the problem for me;
    // even though the default was "Normal", starting it via shell minimised it
    this.WindowState = WindowState.Normal;

    // only required for some scenarios
    this.Activate();
}

5

Bene, poiché questo è un argomento così caldo ... ecco cosa funziona per me. Ho ricevuto degli errori se non l'ho fatto in questo modo perché Activate () ti sbaglierà se non riesci a vedere la finestra.

Xaml:

<Window .... 
        Topmost="True" 
        .... 
        ContentRendered="mainWindow_ContentRendered"> .... </Window>

Codebehind:

private void mainWindow_ContentRendered(object sender, EventArgs e)
{
    this.Topmost = false;
    this.Activate();
    _UsernameTextBox.Focus();
}

Questo era l'unico modo per me per mostrare la finestra in alto. Quindi attivalo in modo da poter digitare nella casella senza dover impostare lo stato attivo con il mouse. control.Focus () non funzionerà a meno che la finestra non sia Active ();


Funziona per me con la schermata iniziale che mostra prima. Grazie.
SiL3NC3

2

Beh, ho trovato un modo per aggirare il problema. Sto effettuando la chiamata da un hook della tastiera utilizzato per implementare un tasto di scelta rapida. La chiamata funziona come previsto se la inserisco in un BackgroundWorker con una pausa. È un kludge, ma non ho idea del motivo per cui originariamente non funzionasse.

void hotkey_execute()
{
    IntPtr handle = new WindowInteropHelper(Application.Current.MainWindow).Handle;
    BackgroundWorker bg = new BackgroundWorker();
    bg.DoWork += new DoWorkEventHandler(delegate
        {
            Thread.Sleep(10);
            SwitchToThisWindow(handle, true);
        });
    bg.RunWorkerAsync();
}

Solo interessato: hai provato Window.Activate (come suggerito da Morten) e gli altri suggerimenti? Sembrano meno hacky di questo ammesso kludge.
Simon D.

Questo è stato un bel po 'di tempo fa, ma sì, all'epoca l'ho provato
Factor Mystic

Questo non funziona sul mio Windows XP. Raccomando la risposta di @Matthew Xavier.
Lex Li

2

Per mostrare QUALSIASI finestra attualmente aperta, importa quelle DLL:

public partial class Form1 : Form
{
    [DllImportAttribute("User32.dll")]
    private static extern int FindWindow(String ClassName, String WindowName);
    [DllImportAttribute("User32.dll")]
    private static extern int SetForegroundWindow(int hWnd);

e nel programma Cerchiamo app con titolo specificato (scrivi titolo senza prima lettera (indice> 0))

  foreach (Process proc in Process.GetProcesses())
                {
                    tx = proc.MainWindowTitle.ToString();
                    if (tx.IndexOf("Title of Your app WITHOUT FIRST LETTER") > 0)
                    {
                        tx = proc.MainWindowTitle;
                        hWnd = proc.Handle.ToInt32(); break;
                    }
                }
                hWnd = FindWindow(null, tx);
                if (hWnd > 0)
                {
                    SetForegroundWindow(hWnd);
                }

"Titolo della tua app SENZA LA PRIMA LETTERA" Oof, hacky hacky hacky. Perché invece non usarlo IndexOfcorrettamente?
Gare di leggerezza in orbita

1

Il problema potrebbe essere che il thread che chiama il codice dall'hook non è stato inizializzato dal runtime, quindi la chiamata ai metodi di runtime non funziona.

Forse potresti provare a eseguire una chiamata per eseguire il marshalling del codice sul thread dell'interfaccia utente per chiamare il codice che porta la finestra in primo piano.


1

Questi codici funzioneranno sempre bene.

All'inizio imposta il gestore di eventi attivato in XAML:

Activated="Window_Activated"

Aggiungi sotto la riga al blocco costruttore della finestra principale:

public MainWindow()
{
    InitializeComponent();
    this.LocationChanged += (sender, e) => this.Window_Activated(sender, e);
}

E all'interno del gestore di eventi attivato copia questi codici:

private void Window_Activated(object sender, EventArgs e)
{
    if (Application.Current.Windows.Count > 1)
    {
        foreach (Window win in Application.Current.Windows)
            try
            {
                if (!win.Equals(this))
                {
                    if (!win.IsVisible)
                    {
                        win.ShowDialog();
                    }

                    if (win.WindowState == WindowState.Minimized)
                    {
                        win.WindowState = WindowState.Normal;
                    }

                    win.Activate();
                    win.Topmost = true;
                    win.Topmost = false;
                    win.Focus();
                }
            }
            catch { }
    }
    else
        this.Focus();
}

Questi passaggi funzioneranno bene e porteranno in primo piano tutte le altre finestre nella finestra dei genitori.


1

Volevo solo aggiungere un'altra soluzione a questa domanda. Questa implementazione funziona per il mio scenario, in cui CaliBurn è responsabile della visualizzazione della finestra principale.

protected override void OnStartup(object sender, StartupEventArgs e)
{
    DisplayRootViewFor<IMainWindowViewModel>();

    Application.MainWindow.Topmost = true;
    Application.MainWindow.Activate();
    Application.MainWindow.Activated += OnMainWindowActivated;
}

private static void OnMainWindowActivated(object sender, EventArgs e)
{
    var window = sender as Window;
    if (window != null)
    {
        window.Activated -= OnMainWindowActivated;
        window.Topmost = false;
        window.Focus();
    }
}

0

Se stai cercando di nascondere la finestra, ad esempio minimizzi la finestra, l'ho trovato usando

    this.Hide();

lo nasconderà correttamente, quindi semplicemente usando

    this.Show();

mostrerà quindi di nuovo la finestra come l'elemento più in alto.


0

Ricorda di non inserire il codice che mostra quella finestra all'interno di un gestore PreviewMouseDoubleClick poiché la finestra attiva tornerà alla finestra che ha gestito l'evento. Inseriscilo nel gestore di eventi MouseDoubleClick o interrompi il bubbling impostando e.Handled su True.

Nel mio caso stavo gestendo PreviewMouseDoubleClick su un Listview e non stavo impostando e.Handled = true, quindi ha sollevato l'evento MouseDoubleClick che ha riportato il focus sulla finestra originale.


-1

Ho creato un metodo di estensione per facilitare il riutilizzo.

using System.Windows.Forms;
    namespace YourNamespace{
        public static class WindowsFormExtensions {
            public static void PutOnTop(this Form form) {
                form.Show();
                form.Activate();
            }// END PutOnTop()       
        }// END class
    }// END namespace

Chiama il Form Constructor

namespace YourNamespace{
       public partial class FormName : Form {
       public FormName(){
            this.PutOnTop();
            InitalizeComponents();
        }// END Constructor
    } // END Form            
}// END namespace

Ciao Mike. Stai rispondendo a questa domanda abbastanza tardi. Puoi spiegare nella tua risposta perché questo approccio è diverso (e forse migliore) dalle ottime risposte già pubblicate per questa domanda?
Noel Widmer

Solo tardi perché avevo solo bisogno di farlo, e mi sono imbattuto in questo e volevo condividere come ho risolto il problema nel caso in cui altri volessero usarlo.
Mike

Certo, sono stato scelto per rivedere il tuo post e volevo informarti. È sempre bene fornire una nuova risposta se pensi che sia un buon contributo per la comunità.
Noel Widmer

2
Questa domanda riguardava specificamente WPF, ma la soluzione è per WinForms.
Brian Reichle
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.