2010-08-06 5 views
1

Comment afficher un formulaire MDIChild toujours au-dessus des autres formulaires MDIChild?Afficher l'enfant MDI Toujours au-dessus des autres enfants MDI

J'ai mis la propriété TopMost du ChildForm à vrai, mais la forme se comporte toujours de la même façon ...

J'ai essayé de définir la propriété TopLevel de ChildForm True et a obtenu le message d'erreur ... " Le style de niveau supérieur d'un contrôle Parented ne peut pas être modifié. "

Comment y parvenir.

Merci

Répondre

1

Le cadre ne semble pas compatible avec Windows MDI enfant possédant l'autre, donc vous devez simuler ce comportement vous:

static Form f1 = new Form(); 
    static Form f2 = new Form(); 
    static Form f3 = new Form(); 

    [STAThread] 
    static void Main() 
    { 
    f1.IsMdiContainer = true; 
    f2.MdiParent = f1; 
    f3.MdiParent = f1; 
    f1.Show(); 
    f2.Show(); 
    f3.Show(); 
    f2.Activated += new EventHandler(f2_Activated); 
    Application.Run(f1); 
    } 

    static void f2_Activated(object sender, EventArgs e) 
    { 
    f3.Activate(); 
    } 

Je viens de faire généralement des formes appartenant à ne pas être les formulaires enfants MDI. Ils ne restent pas dans le conteneur MDI, mais au moins ils restent devant.

La raison pour laquelle cette limitation existe peut-être en raison du comportement souhaité étrange ou ambigu lorsque l'enfant MDI qui est le propriétaire est agrandi dans le conteneur. Le code ci-dessus permettra au formulaire détenu d'aller derrière le parent maximisé si vous cliquez dessus dans ce cas. Si vous l'avez en dehors du conteneur, cependant, il restera visible.

+0

Votre code fonctionne bien .. Mais le plus triste est que je dois câbler cet événement pour chaque autre forme de mon application. –

+0

Il existe également un événement sur le parent MDI lorsqu'un enfant est activé. – BlueMonkMN

0

// Modifier

Comme une seule de votre formulaire MDIChild doit être concentré, essayez ce qui suit:

En cas MdiChildActivate re mise au point ou réactiver la fenêtre requise comme la fenêtre enfant activée.

Vous pouvez également utiliser l'événement Deactivated pour imposer la recentrage de la fenêtre enfant concernée. Lorsque vous créez le formulaire et l'affichez, ajoutez également un appel à la méthode de mise au point.

ChildForm.Focus() 

La mise au point doit être la plus élevée possible.

Espérons que ça aide.

+0

Je crois que Focus apportera le formulaire actif status et l'affichera sur tous les autres formulaires ... Mais lorsque l'utilisateur change de focus pour un autre formulaire MDIChild, ce formulaire sera caché derrière ce formulaire ... En bref, je veux atteindre Always on Top, mais limité à l'intérieur mes fenêtres MDIChild –

+0

Ok, maintenant j'obtiens l'image plus claire. Ma solution devrait fonctionner pour une focalisation 1 fois du formulaire. Merci de clarifier! – Vaibhav

+0

Lorsque j'utilise le code Activer sur ActivateEvent de form2 comme dit par BlueMonk cela fonctionne ... Mais quand j'utilise l'événement Deactivate/Leave de ce formulaire (en haut), cela ne fonctionne pas ... –

1

Une meilleure solution qui ne nécessite pas de changer toute autre forme: - déclarer la nouvelle boîte à outils comme contrôle du parent principal (ce):

fForm fFormObj = new fForm(); 
fFormObj.TopLevel = false; 
this.Controls.Add(fFormObj); 
fFormObj.Parent = this; 
fFormObj.TopMost = true; 
fFormObj.Show(); 
+0

Merci pour le partage! Fonctionne bien ':)' – Anne