2012-03-24 16 views
6

के पीछे ShowDialog() ShowDialog()WindowStyle = WindowStyle.SingleBorderWindow; के साथ WindowStyle = WindowStyle.SingleBorderWindow; के साथ अपने WPF (MVVM) एप्लिकेशन में एक मोडल विंडो खोलने के लिए उपयोग कर रहा हूं, लेकिन यह मुझे विंडोज टास्कबार (विंडोज 7) का उपयोग करके पैरेंट विंडो पर नेविगेट करने देता है।पैरेंट विंडो

मुझे यहां एक उत्तर मिला है: WPF and ShowDialog() लेकिन यह मेरे लिए उपयुक्त नहीं है क्योंकि मुझे "हमेशा शीर्ष पर" टूल विंडो की आवश्यकता नहीं है।

अग्रिम धन्यवाद

उत्तर

9

संवाद की Owner संपत्ति सेट करके देखें। यह काम करना चाहिए।

Window dialog = new Window(); 
dialog.Owner = mainWindow; 
dialog.ShowDialog(); 

संपादित करें: मैं MVVM के साथ इस का उपयोग करते हुए एक ऐसी ही समस्या थी। आप प्रतिनिधियों का उपयोग करके इसे हल कर सकते हैं।

public class MainWindowViewModel 
{ 
    public delegate void ShowDialogDelegate(string message); 
    public ShowDialogDelegate ShowDialogCallback; 

    public void Action() 
    { 
     // here you want to show the dialog 
     ShowDialogDelegate callback = ShowDialogCallback; 
     if(callback != null) 
     { 
      callback("Message"); 
     } 
    } 
} 

public class MainWindow 
{ 
    public MainWindow() 
    { 
     // initialize the ViewModel 
     MainWindowViewModel viewModel = new MainWindowViewModel(); 
     viewModel.ShowDialogCallback += ShowDialog; 
     DataContext = viewModel; 
    } 

    private void ShowDialog(string message) 
    { 
     // show the dialog 
    } 
} 
+0

धन्यवाद, विचार अच्छा है। इस बिंदु पर एकमात्र समस्या यह है कि व्यूमोडेल में मुझे दृश्य की कोई जानकारी नहीं है। मैंने 'App.Current.MainWindow' की कोशिश की और यह काम करता है लेकिन सबसे अच्छा समाधान नहीं। शायद मुझे अपने एमवीवीएम पैटर्न की संरचना पर पुनर्विचार करना चाहिए। – Oszkar

+1

मैंने एमवीवीएम मुद्दे के लिए एक संभावित समाधान जोड़ा। – MatthiasG

+0

@ ओस्ज़कर मैंने 'एप्लिकेशन.क्यूरेंट। मेनविंडो' (ऐप के बजाए आवेदन) का उपयोग किया और, क्योंकि यह स्थिर है - मुझे लगता है - यह परेशान एमवीवीएम के बिना ठीक काम करता है। – heltonbiker

0

"ShowInTaskbar" जोड़ें और इसे गलत पर सेट करें।

1

जब पैरेंट विंडो बच्चे की खिड़की बनाता है (और दिखाता है), जहां आपको मालिक को सेट करने की आवश्यकता होती है।

public partial class MainWindow : Window 
{ 

    private void openChild() 
    { 
     ChildWindow child = new ChildWindow(); 
     child.Owner = this; // "this" is the parent 
     child.ShowDialog(); 
    } 
} 

Aditionally, अगर आप सभी बच्चों के लिए एक अतिरिक्त कार्य पट्टी ... तो

<Window x:Class="ChildWindow"   
     ShowInTaskbar="False" > 
</Window> 
+0

क्या होगा यदि यह 'विंडो' विंडो नहीं है? मैं एमएफसी से डब्ल्यूपीएफ चला रहा हूं और इसलिए मेरे पास कोई एप्लीकेशन या मुख्य विंडो नहीं है। –

+0

आप क्या खोलने की कोशिश कर रहे हैं? बस एक संवाद प्रदर्शित करें? यदि आप एक विंडो में एक संवाद संलग्न करने की कोशिश नहीं कर रहे हैं, तो मैं आपके प्रश्न को समझ नहीं पा रहा हूं। – 00jt

+0

जैसा कि मैंने कहा, "एमएफसी से" ... एमएफसी कक्षाएं डब्ल्यूपीएफ की खिड़की से नहीं ली गई हैं। मैंने हाल ही में WindowInteropHelper.Owner की खोज की है ... हालांकि इसके साथ ही हम छिपे हुए मोडल संवाद के साथ समाप्त होते हैं। –

2

नहीं करना चाहती है कि मैं इस समस्या थी लेकिन खिड़की के रूप में मैं नहीं था एक दृश्य के मॉडल से खोला जा रहा था वर्तमान विंडो का संदर्भ नहीं है। यह दौर प्राप्त करने के लिए मैं इस कोड का इस्तेमाल किया:

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

आप उपयोग कर सकते हैं: myWindow.Owner = Application.Current.MainWindow;

हालांकि, इस विधि समस्याओं का कारण बनता आप तीन खिड़कियां हैं, तो इस तरह खोलें:

MainWindow 
    | 
    -----> ChildWindow1 

       | 
       -----> ChildWindow2 

फिर स्थापित करने ChildWindow2 .wner = Application.Current.MainWindow विंडो के मालिक को अपनी दादा खिड़की के रूप में सेट करेगा, न कि मूल विंडो।

0

भले ही यह पोस्ट थोड़ा पुराना हो, मुझे आशा है कि यह ठीक है कि मैं अपना समाधान पोस्ट करता हूं। सभी उपर्युक्त परिणाम मुझे ज्ञात हैं और वांछित परिणाम नहीं मिला है।

मैं अन्य Googler के लिए यह कर रहा हूँ :)

कहना f2 अपने खिड़की है कि आप f1 के शीर्ष पर प्रदर्शित करना चाहते है की सुविधा देता है:

f2.Owner = Window.GetWindow(this); 
f2.ShowDialog(); 

यह है कि, मैं वादा करता हूँ यह गायब नहीं होगा !

HTH लड़का

0

MVVM पैटर्न के लिए कारण की ज्यादातर ताकि आपके बातचीत तर्क इकाई परीक्षण किया जा सकता है। इस कारण से, आपको व्यूमोडेल से कभी भी विंडो नहीं खोलनी चाहिए, या आपके यूनिट परीक्षणों के मध्य में आपके पास संवाद हो जाएगा।

इसके बजाय, आपको एक ऐसी घटना को उठाना चाहिए जो दृश्य आपके लिए एक संवाद को संभालेगा और खोल देगा।उदाहरण के लिए, इस आलेख को इंटरैक्शन अनुरोधों पर देखें: https://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec12

संबंधित मुद्दे