none
WPF: Существование объекта Window без объекта Application RRS feed

  • Вопрос

  • Занимаюсь изучением WPF, сейчас руки дошли до окон и вообще до основ. Очень странно, что после изучения большого объема материала я только сейчас дошел до этого... ну да ладно :). Вопрос вроде не сложный, но найти ответ на него ну никак не могу. Видимо чего-то не понимаю. 

    Вопрос такой: почему окно может существовать без объекта приложения? Например:

     

    using System;
    using System.Windows;
    
    namespace SimpleWPFstarte
    {
    	public class MainClass
    		{
    		[STAThread]
    		public static void Main()
    			{
    			Window MainWindow = new Window();
    			MainWindow.Title = "This is main window";
    			MainWindow.Show();
    			}
    		}
    }
    

    Окно появляется на мгновение, но затем исчезает, как же так получается? 

    И сразу в добавок... если дописать две строчки после создания окна:
     Application MainApp = new Application();
    MainApp.Run();
    После запуска созданное окно остается "висеть", но приложение MainApp ничто не связывает с оном MainWindow! Свойство MainApp .MainWindow и коллекция MainApp.Windows пусты! Как же тогда это все увязывается.

    Очень прошу объяснить, а то просто двигаться дальше из-за этого не могу :)

     


    • Изменено Agito a42 21 января 2012 г. 12:11
    21 января 2012 г. 12:10

Ответы

  • > MainWindow.Show(); [...] Окно появляется на мгновение, но затем исчезает, как же так получается? 

     
    в windows существует очередь сообщений. см. About Messages and Message Queues
    чтобы окно не закрылось должен работать цикл обработки сообщений. его можно запустить с помощью Application.Run или Window.ShowDialog;
    на реализацию методов можно посмотреть с помощь браузера сборок : ILSpy или Reflector
       
     

    • Изменено Malobukv 21 января 2012 г. 13:20
    • Помечено в качестве ответа Abolmasov Dmitry 24 января 2012 г. 9:02
    21 января 2012 г. 13:19

Все ответы

  • > MainWindow.Show(); [...] Окно появляется на мгновение, но затем исчезает, как же так получается? 

     
    в windows существует очередь сообщений. см. About Messages and Message Queues
    чтобы окно не закрылось должен работать цикл обработки сообщений. его можно запустить с помощью Application.Run или Window.ShowDialog;
    на реализацию методов можно посмотреть с помощь браузера сборок : ILSpy или Reflector
       
     

    • Изменено Malobukv 21 января 2012 г. 13:20
    • Помечено в качестве ответа Abolmasov Dmitry 24 января 2012 г. 9:02
    21 января 2012 г. 13:19
  • > MainWindow.Show(); [...] Окно появляется на мгновение, но затем исчезает, как же так получается? 

     
    в windows существует очередь сообщений. см. About Messages and Message Queues
    чтобы окно не закрылось должен работать цикл обработки сообщений. его можно запустить с помощью Application.Run или Window.ShowDialog;
    на реализацию методов можно посмотреть с помощь браузера сборок : ILSpy или Reflector
       
     

    Я понимаю, что Run запускает цикл обработки сообщений, что позволяет реагировать на события итд. Но мне кажется Application такой объект, что без него даже старт приложения невозможен. 
    • Изменено Agito a42 21 января 2012 г. 13:28
    21 января 2012 г. 13:28
  • > мне кажется Application такой объект, что без него даже старт приложения невозможен.

     
    ниже пример winforms-приложения, в котором создается, компилируется и
    запускается wpf-приложение в отдельном процессе.
    используется ShowDialog.

    using System;
    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using System.Windows.Forms;
    using Microsoft.CSharp;
    
    namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                Start("testwpf.exe");
            }
    
            void Start(string exe)
            {
                var dir = @"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\";
                var cps = new CompilerParameters
                {
                    GenerateInMemory = true,
                    CompilerOptions = @"/target:winexe",
                    OutputAssembly = exe,
                    GenerateExecutable = true
                };
                cps.ReferencedAssemblies.AddRange(new[] {
                    dir+"PresentationCore.dll", 
                    dir+"PresentationFramework.dll", 
                    dir+"WindowsBase.dll",
                    "System.dll"});
                var csp = new CSharpCodeProvider();
                var res = csp.CompileAssemblyFromSource(cps,
                    @"using System;
                        using System.Windows;
                        using System.Windows.Controls;
                        public static class Program { 
                            [STAThread]
                            static void Main() {
                                var wnd = new Window() { Width = 500, Height=500 };
                                wnd.Content = new Label { Content = ""WPF"", FontSize=50.0 };
                                wnd.ShowDialog();    // или new Application().Run(wnd);
                            }}");
                if (res.Errors.Count > 0)
                    throw new Exception(res.Errors[0].ErrorText);
                Process.Start(exe);
            }
        }
    }
    
         
     
    • Изменено Malobukv 21 января 2012 г. 14:51
    21 января 2012 г. 14:48
  • Malobukv, пример-то вроде крут ), но что же он мне-то должен был показать? 
    21 января 2012 г. 15:42
  • > Malobukv, пример-то вроде крут ), но что же он мне-то должен был показать?


    для работы wpf-приложения достаточно вызвать метод Window.ShowDialog

     
    21 января 2012 г. 16:09