WPF: एप्लिकेशन के केंद्र में दिखाने के लिए डायलॉग स्थिति कैसे सेट करें?


86

.ShowDialog();मुख्य विंडो के केंद्र में दिखाने के लिए डायलॉग की स्थिति कैसे सेट करें ।

यह वह तरीका है जिससे मैं स्थिति निर्धारित करने की कोशिश करता हूं।

private void Window_Loaded(object sender, RoutedEventArgs e)
{        
    PresentationSource source = PresentationSource.FromVisual(this);
    if (source != null)
    {
        Left = ??
        Top = ??
    }
}

जवाबों:


35

आप इस तरह भरी हुई घटना में MainWindow की पकड़ पाने की कोशिश कर सकते हैं

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    Application curApp = Application.Current;
    Window mainWindow = curApp.MainWindow;
    this.Left = mainWindow.Left + (mainWindow.Width - this.ActualWidth) / 2;
    this.Top = mainWindow.Top + (mainWindow.Height - this.ActualHeight) / 2;
}

8
यह शीर्ष बाएं कोने को केंद्र में रखता है। यह उत्तर , जिसे स्वीकार नहीं किया गया था, ओपी की इच्छा को अधिक सटीक रूप से पूरा करता है।
क्रिस शिफहैर

279

संवाद से संबंधित XAML में:

<Window ... WindowStartupLocation="CenterOwner">

और जब आप डायलॉग को तुरंत C # में लिखते हैं:

MyDlg dlg = new MyDlg();
dlg.Owner = this;

if (dlg.ShowDialog() == true)
{
    ...

17
वास्तव var dlg = new MyDlg { Owner = this };में दूसरे बिट पर कर सकता है ।
जॉडरेल

6
यदि आप MVVM पैटर्न का उपयोग कर रहे हैं, तो आप इसका उपयोग स्वामी को खोजने के लिए कर सकते हैं:dlg.Owner = Application.Current.MainWindow;
जैकब बसक सोरेनसेन

56

मुझे लगता है कि xaml मार्कअप का उपयोग करना आसान है

<Window WindowStartupLocation="CenterOwner">

नहीं, मैं इसका उपयोग नहीं कर सकता क्योंकि माता-पिता
मेनविंडो

6
आप किसी भी विंडो को Window.Owner सेट करके मालिक बना सकते हैं।
बोगदान

10
mmm CenterParentया CenterOwner? मैं केवल CenterOwnerIntellisense में देखता हूं
Brock Hensley

@dirt यह निर्भर कर सकता है कि आप किस WPF के संस्करण का उपयोग कर रहे हैं।
ब्रेनस्ल्गस 83

CenterOwner और CenterParent क्रमशः WPF और WinForms के बीच अलग-अलग हैं,
F8ER

22

बस कोड में पीछे।

public partial class CenteredWindow:Window
{
    public CenteredWindow()
    {
        InitializeComponent();

        WindowStartupLocation = WindowStartupLocation.CenterOwner;
        Owner = Application.Current.MainWindow;
    }
}

19

मुझे लगता है कि इस सवाल का जवाब हर किसी के पास है कि इसका जवाब क्या होना चाहिए। मैं बस उन्हें एक साथ रखूंगा जो मेरा मानना ​​है कि इस समस्या का सबसे आसान और सुरुचिपूर्ण दृष्टिकोण है।

पहला सेटअप जहां आप चाहते हैं कि खिड़की स्थित हो। यहाँ यह मालिक है।

<Window WindowStartupLocation="CenterOwner">

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

        Window window = new Window();
        window.Owner = Application.Current.MainWindow;
        window.Show();

बस।


1
केंद्र माता-पिता मौजूद नहीं है, WindowStartupLocation इस मामले में CenterOwner होना चाहिए।
उमपा

1
मुझे बताने के लिए धन्यवाद। पता नहीं क्यों मैं CenterParent डाल दिया। इसे बदल दिया गया है।
एलेक्स एलहर्ट

1
मुझे नहीं पता कि यह समाधान क्यों स्वीकार नहीं किया गया है, यह वह है जो गणना के सिरदर्द से बचने की आवश्यकता है, जबकि WPF के पास आउट-ऑफ-द-बॉक्स समाधान है ...
cdie

2
यह सबसे अच्छा उपाय है।
बियोन्डो

1
इससे पहले कि मैं इस उत्तर पर स्क्रॉल करूँ, मैंने ठीक यही किया। दृश्यता के लिए +1!
एलेक्सिस लेक्लेर

8

मुझे यह सबसे अच्छा लगा

frmSample fs = new frmSample();
fs.Owner = this; // <-----
fs.WindowStartupLocation = WindowStartupLocation.CenterOwner;
var result = fs.ShowDialog();

5

यदि आपके पास उन खिड़कियों पर थोड़ा नियंत्रण है, जिन्हें आपको दिखाने की आवश्यकता है, तो निम्नलिखित स्निपेट उपयोगी हो सकते हैं

    public void ShowDialog(Window window)
    {
        Dispatcher.BeginInvoke(
            new Func<bool?>(() =>
            {
                window.Owner = Application.Current.MainWindow;
                window.WindowStartupLocation = WindowStartupLocation.CenterOwner;
                return window.ShowDialog();
            }));
    }

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

3

Windows प्रपत्र माता-पिता के केंद्र में स्थिति के लिए WPF संवाद प्राप्त करने के लिए, मैंने आवेदन के बाद से संवाद के लिए मूल प्रपत्र पास कर दिया। समवर्ती ने Windows प्रपत्र माता-पिता को वापस नहीं किया (मुझे लगता है कि यह केवल तभी काम करता है जब मूल एप्लिकेशन WPF है)।

public partial class DialogView : Window
{
    private readonly System.Windows.Forms.Form _parent;

    public DialogView(System.Windows.Forms.Form parent)
    {
        InitializeComponent();

        _parent = parent;
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        this.Left = _parent.Left + (_parent.Width - this.ActualWidth) / 2;
        this.Top = _parent.Top + (_parent.Height - this.ActualHeight) / 2;
    }
}

WPF डायलॉग पर WindowStartupLocation सेट करें:

<Window WindowStartupLocation="CenterParent">

और विंडोज फॉर्म जिस तरह से WPF डायलॉग को लोड करता है वह इस प्रकार है:

DialogView dlg = new DialogView();
dlg.Owner = this;

if (dlg.ShowDialog() == true)
{
    ...

2

आपको अपनी विंडो (स्वामी) के लिए एक पेरेंट विंडो सेट करनी होगी और फिर WindowStartupLocation प्रॉपर्टी को "CenterPent" ​​पर सेट करना होगा


2
सच है, WPF में संपत्ति को "CenterOwner" कहा जाता है, न कि "CenterParent", हालांकि।
बीटा

2

मैं फ्रेड्रिक हेडब्लैड की प्रतिक्रिया में जोड़ना चाहूंगा कि यदि मेन विंडो को आकार दिया गया है या अधिकतम किया गया है, तो परिणाम गलत होगा, क्योंकि mainWindow.Width और mainWindow.Height XAML पर सेट किए गए मान को दर्शाते हैं।

यदि आप वास्तविक मूल्य चाहते हैं, तो आप mainWindow.ActualWidth और mainWindow.ActualHeet का उपयोग कर सकते हैं:

private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Application curApp = Application.Current;
        Window mainWindow = curApp.MainWindow;
        this.Left = mainWindow.Left + (mainWindow.ActualWidth - this.ActualWidth) / 2;
        this.Top = mainWindow.Top + (mainWindow.ActualHeight - this.ActualHeight) / 2;
    }


0

यदि आप xaml में WindowStartupLocation संपत्ति का उपयोग नहीं करना चाहते हैं तो यह कोड काम करता है:

private void CenterWindowOnApplication()
{
    System.Windows.Application curApp = System.Windows.Application.Current;
    Window mainWindow = curApp.MainWindow;
    if (mainWindow.WindowState == WindowState.Maximized)
    {
        // Get the mainWindow's screen:
        var screen = System.Windows.Forms.Screen.FromRectangle(new System.Drawing.Rectangle((int)mainWindow.Left, (int)mainWindow.Top, (int)mainWindow.Width, (int)mainWindow.Height));
        double screenWidth = screen.WorkingArea.Width;
        double screenHeight = screen.WorkingArea.Height;
        double popupwindowWidth = this.Width;
        double popupwindowHeight = this.Height;
        this.Left = (screenWidth / 2) - (popupwindowWidth / 2);
        this.Top = (screenHeight / 2) - (popupwindowHeight / 2);
    }
    else
    {
        this.Left = mainWindow.Left + ((mainWindow.ActualWidth - this.ActualWidth) / 2;
        this.Top = mainWindow.Top + ((mainWindow.ActualHeight - this.ActualHeight) / 2);
    }
}

मैं "screen.WorkingArea" का उपयोग कर रहा हूं क्योंकि टास्क बार मेनविंडो को छोटा बनाता है। यदि आप विंडो को स्क्रीन के बीच में रखना चाहते हैं, तो आप इसके बजाय "screen.Bounds" का उपयोग कर सकते हैं।


0

बच्चे की खिड़की के लिए, XAML पर सेट करें

WindowStartupLocation="CenterOwner"

अपने बच्चे की खिड़की को माता-पिता के संवाद और केंद्र के रूप में कॉल करने के लिए, उसे मूल विंडो से कॉल करें, जैसे

private void ConfigButton_OnClick(object sender, RoutedEventArgs e)
{
    var window = new ConfigurationWindow
    {
        Owner = this
    };
    window.ShowDialog();
}

0

दस्तावेज़ीकरण के लिए, मैं यहां एक उदाहरण जोड़ूंगा कि मैंने कैसे कुछ इसी तरह हासिल किया। मुझे जो पॉपअप चाहिए था, वह पूरे पैरेंट विंडो कंटेंट एरिया (टाइटल बार को छोड़कर) को कवर करता था, लेकिन बस डायलॉग को सेंट करना और उसकी सामग्री को स्ट्रेच करना काम नहीं करता था क्योंकि डायलॉग हमेशा नीचे से थोड़ा ऑफसेट होता था।

उपयोगकर्ता अनुभव के बारे में ध्यान दें: यह अच्छा नहीं है जब सीमाहीन संवाद दिखाई दे रहा है, तब मैं मूल विंडो को खींच / बंद नहीं कर सकता, इसलिए मैं इसका उपयोग करके पुनर्विचार करूंगा। मैंने भी इस उत्तर को पोस्ट करने के बाद ऐसा नहीं करने का फैसला किया, लेकिन दूसरों को देखने के लिए इसे छोड़ देगा।

कुछ googling और परीक्षण के बाद, मैं आखिरकार इसे इस तरह से करने में कामयाब रहा:

var dialog = new DialogWindow
{
    //this = MainWindow
    Owner = this
};

dialog.WindowStartupLocation = WindowStartupLocation.Manual;
dialog.WindowStyle = WindowStyle.None;
dialog.ShowInTaskbar = false;
dialog.ResizeMode = ResizeMode.NoResize;
dialog.AllowsTransparency = true;

var ownerContent = (FrameworkElement) Content;
dialog.MaxWidth = ownerContent.ActualWidth;
dialog.Width = ownerContent.ActualWidth;
dialog.MaxHeight = ownerContent.ActualHeight;
dialog.Height = ownerContent.ActualHeight;    

var contentPoints = ownerContent.PointToScreen(new Point(0, 0));
dialog.Left = contentPoints.X;
dialog.Top = contentPoints.Y;

dialog.ShowDialog();

DialogWindowएक खिड़की है और अपने मालिक मुख्य आवेदन खिड़की को तैयार है। WindowStartupLocationकरने के लिए सेट किया जाना चाहिए Manualकाम करने के लिए मैन्युअल स्थिति निर्धारण के लिए।

परिणाम:

कोई संवाद नहीं दिखा

मोडल संवाद दिखा रहा है

मुझे नहीं पता कि ऐसा करने का एक आसान तरीका है, लेकिन मेरे लिए काम करने के लिए कुछ और नहीं लगता था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.