2009-11-06 10 views
0
actuelle

j'ai une fenêtre que je construis dans le code, et de montrer:nouvelle fenêtre ouvre sous

Window wndViewer = new Window(); 
wndViewer.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(0xFF, 0x31, 0x31, 0x31)); 
wndViewer.WindowState = WindowState.Maximized; 
wndViewer.Width = 1024; 
wndViewer.Height = 768; 

Grid grd = new Grid(); 

wndViewer.Title = "<Removed>"; 

Viewer vw = new Viewer(); // This is a UserControl 
vw.StudyDate = ((StudyItem)sender).StudyDate.ToString("MM/dd/yyyy"); 
vw.PatientName = ((StudyItem)sender).PatientName; 
vw.PatientId = ((StudyItem)sender).OwnerName; 

vw.Margin = new Thickness(3, 30, 3, 3); 
vw.StudyInstance = ((StudyItem)sender).ItemStudy; 
grd.Children.Add(vw); 

wndViewer.Content = grd; 

refreshTimer.Stop(); 

wndViewer.Tag = vw.StudyInstance; 

wndList.Add(wndViewer); // List<Window> of all the windows opened this way. 

DependencyObject dpParent = LogicalTreeHelper.GetParent(this); 

while (dpParent != null && dpParent.GetType() != typeof(Window)) 
{ 
    dpParent = LogicalTreeHelper.GetParent(dpParent); 
} 

wndViewer.Owner = (Window)dpParent; 

wndViewer.ShowActivated = true; 

wndViewer.Show(); 

Le problème est que je dois cette fenêtre pour afficher au-dessus de la fenêtre en cours, et arrive toujours sous la fenêtre actuelle. J'ai essayé plusieurs solutions:

wndViewer.BringIntoView(); 

Importation et appel:

[DllImport("User32.dll")] 
public static extern Int32 SetForegroundWindow(int hWnd); 

[DllImport("user32.dll")] 
public static extern int FindWindow(string lpClassName, string lpWindowName);      

Donc, je suis sûr que je suis ici avec vue sur quelque chose. Merci pour toute aide!

~ md5sum ~

Répondre

1

Avez-vous essayé de définir la propriété TopMost de la fenêtre?

Vous pouvez trouver plus d'informations sur le MSDN

Obtient ou définit une valeur qui indique si une fenêtre apparaît dans l'ordre z supérieure. C'est une propriété de dépendance.

Comme vous l'avez souligné dans votre commentaire, cela fera de la fenêtre toujours le meilleur. Il serait également "hackish" de réinitialiser le drapeau après que la fenêtre a été montrée.

EDIT

Je viens de voir dans votre code que vous définissez la propriété Owner de la fenêtre pour être:

wndViewer.Owner = (Window)dpParent; 

Je l'ai utilisé ce qui semble « juste travail ":

var about = new AboutBox(); 
about.Owner = this; 
about.Initialise(); 
about.Show(); 

maintenant, dans ce cas AboutBox est dérivé de Window plutôt tha n UserControl, donc il peut y avoir quelque chose ici, mais est-ce qu'il y a une raison pour laquelle vous devez régler Owner à autre chose que this?

+0

Cela semble avoir fait l'affaire ... Cependant, c'est un peu "hackish", puisque maintenant les fenêtres dynamiques doivent être déplacées de la fenêtre principale pour revenir à la fenêtre principale. Cela va certainement fonctionner pour le moment! –

+0

"this" dans ce cas n'est pas une fenêtre, mais plutôt un UserControl, donc j'obtiens la fenêtre parent logique et l'utilise, puisque la propriété owner accepte UNIQUEMENT une fenêtre. De plus, la classe Window n'a pas de méthode Initialise accessible au public, elle doit donc être spécifique à AboutBox. –

+0

Et (hackish ou pas) réinitialiser le drapeau dans le gestionnaire d'événements vw.Loaded a l'effet exact dont j'ai besoin ici. La fenêtre se place devant, mais ne force pas à l'avant tout le temps. –

Questions connexes