2010-01-10 14 views

उत्तर

81

एक संभव तरीका आवेदन में खुले विंडो की सूची स्कैन और जाँच उनमें से एक IsActive = true है जो करने के लिए होगा:

Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive); 

सुनिश्चित नहीं हैं कि अगर वहाँ एक से अधिक सक्रिय विंडो अगर हो सकता है, उदाहरण के लिए , एक मॉडल संवाद दिखा रहा है, इस मामले में, संवाद के मालिक और संवाद स्वयं सक्रिय हो सकता है।

+0

मेरे पुराने उत्तर को दोबारा देखकर, '() 'के बजाय' ऑफ टाइप ()' ऑपरेटर का उपयोग करना बेहतर हो सकता है ... –

+0

कमाल! यह मुझे खिड़की के संदर्भ को पास करने से रोकता है, जो मेरी डेटा संरचना को UI संदर्भों से मुक्त रखता है। धन्यवाद! – BrokeMyLegBiking

+5

इसे और अधिक मजबूत बनाने के लिए, आप 'सिंगलऑर्डफॉल्ट' के बजाय 'फर्स्टऑर्डडिफॉल्ट' का भी उपयोग कर सकते हैं जो एकाधिक मिलान वाले आइटम होने पर अपवाद फेंकता है। इसके अलावा यह थोड़ा तेज़ होना चाहिए क्योंकि यह पहले परिणाम को स्वीकार करता है और यह जांचने की आवश्यकता नहीं है कि यह केवल एक ही है। – ygoe

19

PInvoke का उपयोग करके ऐसा करने का बेहतर तरीका है। Aviads जवाब हर समय काम नहीं कर रहा है (संवाद के साथ कुछ किनारे के मामले हैं)।

IntPtr active = GetActiveWindow(); 

ActiveWindow = Application.Current.Windows.OfType<Window>() 
    .SingleOrDefault(window => new WindowInteropHelper(window).Handle == active); 

एक आयात के बाद पहले शामिल करना चाहिए:

[DllImport("user32.dll")] 
static extern IntPtr GetActiveWindow(); 
+1

हेहे। मुझे यह खोजने के लिए मुझे कुछ घंटे लगे।मैंने वास्तव में आपके जैसा ही लिखा और इसे साझा करने के लिए यहां आ गया, लेकिन आप पहले थे, इसलिए मेरा वोट यहां है: पी –

+6

क्या आप किनारे के मामलों के बारे में विस्तार से बता सकते हैं? – nchaud

+1

@nchaud मैं AvalonDock का उपयोग कर रहा हूं जो आपको मुख्य विंडो से और एक नई विंडो में वर्कस्पेस खींचने की अनुमति देता है। हालांकि, इन खिड़कियों को 'IsActive' भी चिह्नित किया गया है। दूसरे समाधान का उपयोग करके अपवाद फेंक दिया गया ('सिंगलऑर्डफॉल्ट 'फेंकता है यदि भविष्य में एक से अधिक मिलान हो रहे हैं) या' फर्स्टऑर्ड डीफॉल्ट 'का उपयोग करते समय मुझे वास्तविक सक्रिय विंडो नहीं दी – clcto

0

मैं इस तरह के साथ समस्या है "। Application.Current.Windows.OfType() SingleOrDefault (x => x.IsActive);" विशेष क्योंकि मैं मुख्य विंडो के साथ एक अनुप्रयोग बना रहा था, तब मुख्य विंडो का चयन होने पर मुझे समस्याएं थीं। मैं इसे इस बनाने हल:

कुछ आधार वर्ग में या App.xaml.cs बनाने यह:

 public static Window ActivatedWindow {get;set;} 

फिर अपने आधार वर्ग पाने विंडो या अपने विंडो के सक्रिय घटना के सभी में डाल:

पहले विकल्प - व्यक्तिगत खिड़की बेस कक्षा:

 public class MetroToolWindowBase 
     { 
     public MetroToolWindowBase() 
     { 
      Activated += new EventHandler(MakeActive); 
     } 
     private void MakeActive(object sender, EventArgs e) 
     { 
     App.ActivatedWindow= this; 
     } 
     } 

दूसरा Windows के सक्रिय घटना में विकल्प:

+०१२३५१६४१०
private void XWindow_Activated(object sender,EventArgs e) 
    { 
    App.ActivatedWindow= this; 
    } 
0

मुझे पता है कि यह एक छोटा सा सवाल है लेकिन मुझे लगता है कि मेरा जवाब किसी की मदद कर सकता है।

मेरे समस्या यह थी: मैं एक WPF MVVM आवेदन यानी दूसरा दृश्य मॉडल थी और मैं दूसरे दृश्य में मेरी MainWindow उदाहरण पाने के लिए की जरूरत है,, visible को शीर्षक पट्टी बटन की दृश्यता सेट करने के लिए।

MainWindow window = (MyApp.MainWindow)App.Current.MainWindow; 
window.btnSearch.Visibility = System.Windows.Visibility.Visible; 

आशा इस किसी की मदद करेंगे:

यह मेरा समाधान है।

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