سؤال

أنا أكتب أول تطبيق لي في WPF وأريد أن يقوم المستخدم بإدخال بعض البيانات في نافذة حوار مشروط.على ما يبدو، ليس من السهل القيام بذلك في WPF، لأن النافذة الرئيسية تظل ممكنة بالكامل، والطريقة التي أنشأت النافذة الفرعية الجديدة لا تتوقف وتنتظر حتى تتصل النافذة الفرعية بـ Close().وبدلاً من ذلك يستمر في المضي قدمًا.هذا ليس ما أريد.

كيف يمكنني فتح النافذة الفرعية، وجعل النافذة الأصلية تنتظر حتى تغلق النافذة الفرعية قبل أن تستمر النافذة الأصلية في التنفيذ؟

هل كانت مفيدة؟

المحلول

هل حاولت إظهار نافذتك باستخدام ShowDialog طريقة؟

لا تنسى تعيين ملكية المالك في نافذة الحوار إلى النافذة الرئيسية.سيؤدي هذا إلى تجنب السلوك الغريب عند الضغط على Alt+Tabbing، وما إلى ذلك.

نصائح أخرى

وهناك الكثير من هذه الإجابات والتبسيط، واذا كان هناك من بدأ برنامج الأغذية العالمي، فإنها قد لا تعرف كل من "اعتصامات والرافضة"، لأنها أكثر تعقيدا من مجرد قول أحدهم "استخدام .ShowDialog()!". ولكن هذا هو أسلوب (لا .Show()) التي تريد استخدامها من أجل منع استخدام النافذة الأساسية والحفاظ على رمز من الاستمرار حتى يتم إغلاق إطار مشروط.

أولا، تحتاج 2 النوافذ WPF. (واحد سيكون يدعو الآخر).

ومن الإطار الأول، دعنا نقول أن كان يسمى MainWindow.xaml، في تقريرها التعليمات البرمجية الخلفية على النحو التالي:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

وثم إضافة زر لXAML الخاص بك:

<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />

وبزر الماوس الأيمن فوق روتين Click، حدد "الذهاب إلى تعريف". انها سوف تخلق لك في MainWindow.xaml.cs:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
}

وضمن تلك الوظيفة، لديك لتحديد صفحة أخرى باستخدام الطبقة صفحتها. نقول لكم اسمه أن صفحة أخرى "ModalWindow"، بحيث يصبح الفئة صفحة وهو كيف سيكون مثيل (الدعوة) ما يلي:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();
}

ويقول لديك قيمة تحتاج إلى تعيين على حوار مشروط الخاص بك. إنشاء مربع نص وزر في XAML ModalWindow:

<StackPanel Orientation="Horizontal">
    <TextBox Name="txtSomeBox" />
    <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> 
</StackPanel>

وثم إنشاء معالج الحدث (الحدث Click آخر) مرة أخرى واستخدامه لحفظ القيمة النص إلى متغير ثابت العام على ModalWindow وندعو this.Close().

public partial class ModalWindow : Window
{
    public static string myValue = String.Empty;        
    public ModalWindow()
    {
        InitializeComponent();
    }

    private void btnSaveData_Click(object sender, RoutedEventArgs e)
    {
        myValue = txtSomeBox.Text;
        this.Close();
    }
}

وبعد ذلك، بعد بيان .ShowDialog() الخاص بك، يمكنك انتزاع تلك القيمة واستخدامها:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();

    string valueFromModalTextBox = ModalWindow.myValue;
}

وWindow.Show النافذة سوف تظهر النافذة، ومتابعة تنفيذ - انها غير مؤمن دعوة

.

وWindow.ShowDialog ومنع ترابط استدعاء (كيندا [1])، وتظهر في مربع الحوار. فإنه سيتم منع أيضا التفاعل مع الوالد / امتلاك النافذة. عندما يتم رفض الحوار (forwhatever سبب) ShowDialog سيعود إلى المستدعي، وسوف تسمح لك بالوصول إلى DialogResult (إذا كنت تريد ذلك).

[1] وسوف تبقى ضخ مرسل عن طريق دفع إطار مرسل على dipatcher WPF. سيؤدي هذا إلى مضخة رسالة للحفاظ على الضخ.

وبالنظر إلى myWindow الكائن النافذة، myWindow.Show () وفتحه modelessly وmyWindow.ShowDialog () وفتحه مشروط. ومع ذلك، وحتى هذه الأخيرة لا يمنع، من ما أتذكر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top