2011-06-20 17 views
23

WPF (MVVM) uygulamasında modal bir pencere açmak için Window.ShowDialog() kullanıyorum, ancak Windows görev çubuğunu kullanarak diğer pencerelere gitmeme izin veriyor (Windows 7).Modal Dialog diğer pencerelerin üstünde gösterilmiyor

Bunu düşünün: Uygulamamda 3 adet kalıcı olmayan pencerem var. Şimdi bunlardan biri Window.ShowDialog() kullanarak modal bir pencere açar. Ayrıca, modal pencerenin sahibi olarak Application.MainWindow'u da ayarlıyorum. Bu yüzden MVVM mesajlaşma kullanıyorum ve yeni bir pencere açmak için mesaj işleyicisi App.xaml.cs'da merkezileştirildi. Pencere modaya açılır - sorun yok. Ancak, Windows 7, diğer uygulama pencerelerine görev çubuğundan geçiş yapmamı sağlıyor. Bu, modal pencerenin sahip olmamayı tercih ettiğim başka bir pencerenin arkasına geçtiği bir duruma yol açar.

Takla açık olduğu sürece diğer pencerelerde hiçbir şey yapamıyorum, ancak kalıcı pencerenin açık olduğu sürece her zaman en üstte kalması hoş olurdu. Modal açıkken görev çubuğu geçişini devre dışı bırakmanın bir yolu var mı? FYI - app başlatılan tüm açık pencereler görev çubuğunda ayrı girişler olarak görünür.

Şimdiden teşekkürler!

+0

Modal iletişim kutusu olan Pencereyi oluşturduğunuz yerden bir kod alabilir miyiz? – user7116

+0

Pencerenin tüm diğer uygulamaların üzerinde olması için ihtiyacınız olan şeydi. İhtiyacım olan şey, pencerenin bir iletişim penceresi gibi, uygulamadaki herhangi bir pencerenin üzerinde olması. Benim gereksinimleri için, bu iki satır: Sahibi = Application.Current.MainWindow; ve ShowInTaskbar = false; iyi çalışıyor. Senin için +1. –

cevap

55

Orada off bu temel almak herhangi bir kod değil, ama ek "iletişim" anlambilim uygulamak ShowDialog oluşturduğunuz Window bazı özelliklerini bıraktığı ve beklenen gibi geliyor:

Window window = new Window() 
{ 
    Title = "Modal Dialog", 
    ShowInTaskbar = false,    // don't show the dialog on the taskbar 
    Topmost = true,      // ensure we're Always On Top 
    ResizeMode = ResizeMode.NoResize, // remove excess caption bar buttons 
    Owner = Application.Current.MainWindow, 
}; 

window.ShowDialog(); 
+0

Bir savior sixlettervariables'sin! En nihayet eksik olduğum şeydi. Kod yayınlamadığınız için özür dileriz, ancak siz onu çivilenmişsiniz. Onu özlediğime inanamıyorum. Tekrar teşekkürler! – Pratz

+0

Altyazı düğmelerini kaldırmak için 'WindowStyle' yerine' ResizeMode'unu 'NoResize' olarak ayarlamanız gerekir. ToolWindow bir iletişim kutusu değildir. –

+0

@DavidAnderson: diyaloğu yeniden boyutlandırmak istemediğiniz sürece iyi geliyor. – user7116

9

En Sağdan Başa Ayarlama (En üst = Doğru) iletişim kutusunun sistemdeki tüm pencerelerin üstünde olmasına neden olur (yalnızca uygulamada değil).

Activated += WindowActivated; 

ve uygulamanızın başka ana penceresi etkin duruma geldiğinde kalıcı iletişim bir sahibi penceresi her zaman aktif hale:

Yani Etkinlik ana pencerede Aktif kayıt deneyin.

private void WindowActivated(object sender, EventArgs e) 
{ 
    Window window = Application.Current.Windows.OfType<YourMainWindow>().FirstOrDefault(p => p != this && !p.IsActive && p.OwnedWindows.Count > 0); 
    if (window != null) 
    { 
     window.Activate(); 
    } 
} 

Bu basit kesmek

tüm çocuklar pencereleri modal varsayar, ancak bir daha sofistike mantığı yazabilirsiniz.

+1

bu kabul edilen cevap olmalıdır: Bu, görev çubuğunu kullanarak uygulamayı etkinleştirdikten sonra iletişim penceresini ana pencerenin üstünde tutmanın tek yolu gibi görünüyor. Bu bilinen bir sorundur: http://connect.microsoft.com/VisualStudio/feedback/details/474480/wpf-showdialog-and-owner – stijn

+0

Bu, iletişim kutusunun kendisinden (olayı + = kullanarak) daha iyi çalışır. Bu, ana pencerenin diğer pencerelerin ne yaptığını umursamamasını sağlar. – Grault

+0

Oh ve iletişim kutusu gizlenirken etkinleştirildiğinde (aslında onu kapatmak istemediğimden) ana pencereyi çalışmaz hale getirir, bu nedenle IsVisible denetiminin sırası vardır. – Grault

10

Pencerenin sahiplik özelliğini yalnızca arama penceresine ayarlayın. Daha sonra WPF uygulamasının görev çubuğundaki aktivasyonu sadece MainWindow'u değil aynı zamanda modal alt pencereyi de etkinleştirir ve ön tarafa getirir.

ChildWindow C = new ChildWindow(); 
C.Owner = this; 
C.ShowDialog(); 
1

Biraz değişiklik yapmak zorundaydık. Sahneyi ayarlamak ve pencereyi etkinleştirmek zorunda kaldım. Açılır pencereyi kontrol edin ve aşağıdaki gibi pencereyi etkinleştirin.

 var enumerator = Application.Current.Windows.GetEnumerator(); 
     while (enumerator.MoveNext()) 
     { 
      Window window = (Window)enumerator.Current; 
      if (window != null && window.GetType() == typeof(PopUpWindow)) 
      { 
       window.Activate(); 
      } 
     } 
3

Buradaki yanıtların bir bileşimini kullanarak sona erdim. Kabul edilen cevap ilk başta yararlıydı, ancak diğer insanlar burada Topmost = true ayarının işaret ettiği gibi, pencerenin her zaman çalışan diğer uygulamaların üstündedir.

var myWindow = new MyWindowType(); 
myWindow.Owner = Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive); 

Başlangıçta kullanılan:

MainWindow 
    | 
    -----> ChildWindow1 

       | 
       -----> ChildWindow2 

Sonra ChildWindow2.Owner = Application.Current.MainWindow ayar belirleyecektir: Böyle açmak üç pencere varsa

myWindow.Owner = Application.Current.MainWindow; 

Ancak bu yöntem sorunlarına neden benim çözüm bu oldu Pencerenin sahibi büyükbaba penceresi, üst pencere değil.

Bir şeyleri hızlandırmak için, Visual Studio'da kod snippet'i olarak ekledim. Araçlar için aşağıdaki eklerseniz -> Kod Parçacığı Yöneticisi -> My Kod Parçaları:

<CodeSnippets 
    xmlns="http://schemas.microsoft.com/VisualStudio/2010/CodeSnippet"> 
    <CodeSnippet Format="1.0.0"> 
    <Header> 
     <Title>MVVM Set owner of page to be current active window</Title> 
     <Shortcut>owner</Shortcut> 
    </Header> 
    <Snippet> 
     <Code Language="CSharp"> 
     <![CDATA[System.Windows.Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);]]> 
     </Code> 
    </Snippet> 
    </CodeSnippet> 
</CodeSnippets> 

yazarak 'sahibi' ve iki kez hafifçe sekme anahtar sizin için otomatik yılında 'Application.CurrentWindows...' bölümünü katacak.

+1

bu kişi hayatımı kurtardı çünkü herkesin belirttiği tüm seçenekleri belirledim, ancak ana pencerenin ne olabileceğini hiç görmedim. cevabın bana bakmamı sağladı –