2010-10-26 18 views
40

मेरे पास एक डब्ल्यूपीएफ एप्लीकेशन है और मुझे यह जानने की जरूरत है कि कैसे वैन विंडो प्रोग्रामेटिक रूप से (एक्सएएमएल में नहीं) को कैसे केंद्रित किया जाए।आप डब्ल्यूपीएफ में अपनी मुख्य विंडो कैसे केन्द्रित करते हैं?

मुझे स्टार्टअप और कुछ उपयोगकर्ता घटनाओं के जवाब में ऐसा करने में सक्षम होना चाहिए। इसे गतिशील रूप से गणना की जानी चाहिए क्योंकि खिड़की का आकार ही गतिशील है।

ऐसा करने का सबसे आसान तरीका क्या है? पुराने Win32 कोड के तहत, मैं सिस्टम मेट्रिक्स फ़ंक्शंस को कॉल करता हूं और इसे सब कुछ काम करता हूं। क्या यह अभी भी जिस तरह से किया गया है या क्या कोई आसान CenterWindowOnScreen() फ़ंक्शन है जिसे मैं अब कॉल कर सकता हूं।

_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen; 

दुर्भाग्य:

उत्तर

61
private void CenterWindowOnScreen() 
{ 
    double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth; 
    double screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight; 
    double windowWidth = this.Width; 
    double windowHeight = this.Height; 
    this.Left = (screenWidth/2) - (windowWidth/2); 
    this.Top = (screenHeight/2) - (windowHeight/2); 
} 

आप अपनी स्क्रीन के केंद्र में विंडो स्थिति सेट करने के लिए इस विधि का उपयोग कर सकते हैं।

+0

मैं तुम्हें उस के लिए एक दे देंगे लेकिन मैं इसे याद करने लगते हैं एक बहुत अधिक काम है, को ध्यान में रखकर खाता कार्य सलाखों और बहुत आगे। फिर भी, 'SystemParameters' के लिए +1 और कुछ कोड इसलिए मुझे' GetSystemMetrics' 'पर जाना नहीं है। – paxdiablo

+0

खिड़की को प्रोग्रामेटिक रूप से बदलने के बाद खिड़की को फिर से केंद्र करने का एकमात्र तरीका ऊंचाई और/या चौड़ाई या उसके स्थान के बाद बदल दिया गया है। – azarc3

+7

यह केवल तभी काम करता है यदि आपके पास 1 मॉनीटर है, या यदि आपके सभी मॉनीटर एक ही आकार हैं – JumpingJezza

3

एक बुनियादी समाधान के रूप में, आप खिड़की के StartupLocation संपत्ति का उपयोग कर सकते, System.Windows.WindowStartupLocation गणन में परिभाषित enum में से एक मान के लिए सेट, वहाँ स्क्रीन के केंद्र के लिए एक है यह हमेशा इतना आसान नहीं है; आपको एकाधिक मॉनीटर, टास्कबार आदि के लिए खाते की आवश्यकता है। "सेंटरस्क्रीन" विकल्प स्क्रीन के केंद्र में विंडो खोलता है जिसमें माउस कर्सर होता है। बहुत सारी जानकारी के लिए this SO question देखें, या api का संदर्भ लें।

78

खैर, स्टार्टअप समय के लिए, आप startup location सेट कर सकते हैं:

window.WindowStartupLocation = WindowStartupLocation.CenterScreen; 

बाद में, आप यह क्वेरी करने के लिए की आवश्यकता होगी। जानकारी (कम से कम प्राथमिक स्क्रीन के लिए) SystemParameters.PrimaryScreenWidth/ऊंचाई के माध्यम से उपलब्ध है।

20
Rect workArea = System.Windows.SystemParameters.WorkArea; 
this.Left = (workArea.Width - this.Width)/2 + workArea.Left; 
this.Top = (workArea.Height - this.Height)/2 + workArea.Top; 

यह और स्थिति (System.Windows.SystemParameters.WorkArea का उपयोग करके) को ध्यान में रखता टास्कबार आकार

+6

यह स्वीकार्य उत्तर होना चाहिए। – amnesia

+3

यह केवल तभी काम करता है यदि आपके पास 1 मॉनिटर है, या यदि आपके सभी मॉनीटर एक ही आकार – JumpingJezza

53

नहीं है (workArea.Left और workArea.Top जोड़कर) यह बस के रूप में सरल

WindowStartupLocation="CenterScreen" 

में स्थापित करने के लिए खिड़की के लिए एक्सएएमएल परिभाषा।

+2

हैं तो स्टार्टअप स्थान के लिए यह ठीक है, लेकिन जैसा कि मैंने प्रश्न में बताया है, मैं भी विंडो में बदलाव करते समय प्रोग्राम के भीतर ऐसा करना चाहता हूं आकार। – paxdiablo

+0

क्षमा करें, हाँ आप सही हैं। मुझे आश्चर्य हुआ कि इतने सारे लोग गैर स्पष्ट समाधान के लिए क्यों गए। :-) – naskew

6

खिड़की तत्व में सिर्फ इस विशेषता-मान युग्म जोड़ें: WindowStartupLocation = "CenterScreen"

+3

"प्रोग्रामेटिक रूप से, एक्सएएमएल में _not_"। किसी भी मामले में, क्या यह सिर्फ नास्के के उत्तर का डुप्लिकेट नहीं है? – paxdiablo

+0

इस उत्तर के लिए धन्यवाद! मैं एक दुकान में काम कर रहा हूं जहां हम xaml में सबकुछ करते हैं। "प्रोग्रामेटिक" तरीका चालाक है, लेकिन WPF तरीका नहीं है। – James

5

मामले में आप एक कई स्क्रीन वातावरण में एक खिड़की आकर्षित करने के लिए की जरूरत है। मैं एक स्थिर वर्ग जहां निम्न विधि को फिर से इस्तेमाल किया जा सकता कर दिया है:

public static void PostitionWindowOnScreen(Window window, double horizontalShift = 0, double verticalShift = 0) 
{ 
    Screen screen = Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(window).Handle); 
    window.Left = screen.Bounds.X + ((screen.Bounds.Width - window.ActualWidth)/2) + horizontalShift; 
    window.Top = screen.Bounds.Y + ((screen.Bounds.Height - window.ActualHeight)/2) + verticalShift;   
} 

खिड़की के निर्माता में अब सिर्फ विधि कॉल:

this.Loaded += (s, a) => Globals.PostitionWindowOnScreen(this, 0, 0) 
+0

किसी कारण से, यह विधि मेरी खिड़की को शीर्ष से 20 पिक्सल दूर रखती है? यह चुने गए उत्तर से मेरे लिए बेहतर काम कर रहा है। – Andy

0

आप इसे अधिकतम होना शेष है एक बार
यह। WindowState = System.Windows.WindowState।अधिकतम;

9

मैं मेरे मामले में सभी आधारों को शामिल करने के लिए इन सवालों के जवाब के कुछ ही गठबंधन करने के लिए किया था:

  • Peter's method वर्तमान पर नजर रखने को खोजने के लिए - नहीं बल्कि सिर्फ प्राथमिक मॉनिटर (गंभीरता से जो काम पर सिर्फ 1 मॉनिटर है की तुलना में अब और?
  • @Wild_A's method का उपयोग के बजाय टास्कबार के लिए स्थान को ध्यान में रखने के लिए का उपयोग करने के लिए।
  • मुझे डीपीआई स्केलिंग जोड़ना था, खासकर 1280x800 को 1024x640 के रूप में प्रदर्शित करने वाले टैबलेट के लिए, लेकिन किनारे के मामलों को कवर करने के लिए उपयोगी है, जिसके लिए मुझे here का उत्तर मिला। नोट dpiScaling चर अशक्त है अगर पहले लोड पर कहा जाता है से पहले यूआई प्रदर्शित किया जाता है (explained here)
//get the current monitor 
Screen currentMonitor = Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(Application.Current.MainWindow).Handle); 

//find out if our app is being scaled by the monitor 
PresentationSource source = PresentationSource.FromVisual(Application.Current.MainWindow); 
double dpiScaling = (source != null && source.CompositionTarget != null ? source.CompositionTarget.TransformFromDevice.M11 : 1); 

//get the available area of the monitor 
Rectangle workArea = currentMonitor.WorkingArea; 
var workAreaWidth = (int)Math.Floor(workArea.Width*dpiScaling); 
var workAreaHeight = (int)Math.Floor(workArea.Height*dpiScaling); 

//move to the centre 
Application.Current.MainWindow.Left = (((workAreaWidth - (myWindowWidth * dpiScaling))/2) + (workArea.Left * dpiScaling)); 
Application.Current.MainWindow.Top = (((workAreaHeight - (myWindowHeight * dpiScaling))/2) + (workArea.Top * dpiScaling)); 

जहां myWindowWidth और myWindowHeight चर मैं मैन्युअल रूप से खिड़की पहले के आकार को निर्धारित करने के लिए इस्तेमाल कर रहे हैं।

+0

मेरे पास सिर्फ एक मॉनिटर है - 40 "4K रिज़ॉल्यूशन के साथ। यह नहीं देख सकता कि किसी को भी एक से अधिक की आवश्यकता क्यों होगी (या अधिक डेस्क स्थान कौन होगा);) – CramerTV

+1

@ क्रैमर टीवी हा सच! बार वे बदल रहे हैं :) यद्यपि डेमो – JumpingJezza

+0

के लिए मॉनीटर में प्लग करने के लिए अभी भी प्रासंगिक है, लेकिन दो उत्तरों के महान संयोजन ने इसका उपयोग किया है और यह पूरी तरह से काम करता है। और हाँ मैंने 3 स्क्रीन का उपयोग किया- एक विजुअल स्टूडियो के साथ, एक पीडीएफ (ईबुक) वाला, एक स्टैक ओवरफ्लो/आउटलुक के साथ – JohnChris

0

@Wild_A जवाब मैं सिर्फ SizeChanged घटना की सदस्यता ली है, और इस ईवेंट हैंडलर जोड़ा के आधार पर:

private void Window_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    try 
    { 
     Rect workArea = SystemParameters.WorkArea; 
     this.Left = (workArea.Width - e.NewSize.Width)/2 + workArea.Left; 
     this.Top = (workArea.Height - e.NewSize.Height)/2 + workArea.Top; 
    } 
    catch (Exception ex) { ... Handel exception; } 
} 
संबंधित मुद्दे