Перейти к содержимому

Как запустить wpf приложение

  • автор:

Приложение и класс Application

В предыдущих главах мы работали непосредственно с окном приложения, которое представлено классом Window, его разметкой, добавляли в нее элементы, создавали для него код на C#. Однако само приложение начинается не с класса Window , а с класса Application . По умолчанию при создании проекта WPF создается файл App.xaml и класс связанного кода App.xaml.cs :

Класс Application в WPF и C#

Файл App.xaml выглядит примерно так:

С помощью атрибута x:Class элемент Application задает полное название производного класса приложения. По умолчанию класс называется App , с указанием названия проекта, то есть в данном случае HelloApp.App

Как правило, основная задача данного файла состоит в определении ресурсов, общих для приложения. Поэтому тут по умолчанию определен пустой элемент Application.Resources , в который, собственно, и помещаются ресурсы.

Также здесь декларативным путем можно прикрепить к событиям приложения обработчики.

С помощью атрибута StartupUri устанавливается путь к разметке xaml, с которого начинается выполнение приложения. По умолчанию это разметка окна MainWindow, определенного в файле MainWindow.xaml . Если у нас в приложении несколько окон, тут мы можем указать то, которое будет запускаться при вызове приложения.

файл App.xaml.cs также содержит определение класса App. По умолчанию этот класс совершенно пустой:

public partial class App : Application

В нем мы можем задать обработчики событий приложения, либо какую-то другую глобальную для всего приложения логику.

Таким образом, у нас получается, что оба файла App.xaml и App.xaml.cs содержат определение одного и того же класса App. Однако в конечном счете они будут компилироваться в один файл приложения App.g.cs , который вы можете найти после компиляции приложения в каталоге проекта obj/Debug/netX.0-windows

Компиляция приложения WPF на C# и App.g.cs

Данный класс будет выглядеть примерно так:

public partial class App : System.Windows.Application < [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "7.0.3.0")] public void InitializeComponent() < #line 5 "..\..\..\App.xaml" this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative); #line default #line hidden >[System.STAThreadAttribute()] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "7.0.3.0")] public static void Main() < HelloApp.App app = new HelloApp.App(); app.InitializeComponent(); app.Run(); >>

Входной точкой в программу (как и в любое другое приложение на C#) является метод Main, в котором создается экземпляр приложения и производится начальная инициализация и вызов главного окна программы.

Так как WPF требует, чтобы главный поток работал в однопоточном подразделении (Single-threaded apartment), то метод Main помечается атрибутом STAThreadAttribute . Однопоточное подразделение содержит один поток, в данном случае главный. Это означает, что к элементам, созданным в этом потоке можно обратиться только из этого же потока. В то же время WPF предлагает эффективный способ взаимодействия между потоками, о котором мы позже поговорим.

С помощью метода InitializeComponent происходит инициализация приложение: установка главного окна для запуска. И далее само приложение запускается через вызов app.Run() .

Также в той же папке можно найти файл App.g.i.cs , который имеет идентичное содержимое, но применяется различными службами Visual Studion, например, Intellisense.

Однако это не жестко заданная организация файлов приложения, и мы ее можем переопределить и установить точку входа в приложение сами. Для этого, во-первых, удалим файл App.g.cs . И во-вторых, изменим код App.xaml.cs :

using System; using System.Windows; using HelloApp; public partial class App : Application < [STAThread] static void Main() < App app = new App(); MainWindow window = new MainWindow(); window.Title = "Hello METANIT.COM"; app.Run(window); >>

Фактически файл App.xaml.cs стал похож на компилируемый файл App.g.cs . Здесь мы сразу определяем метод Main, создаем главное окно — объект класса MainWindows, устанавливаем его заголовок и запускаем ее.

И после запуска нам отобразится главное окно приложения с измененным заголовком.

Как запустить wpf приложение

Для создания приложений с помощью технологии WPF мы можем ограничиться текстовым редактором и .NET CLI. Тем не менее мы также можем использовать среду разработки Visual Studio, которая в некоторых аспектах упрощает написание приложения. Например, возьмем ее бесплатную и полнофункциональную версию — Visual Studio Community 2022 , которую можно загрузить по следующему адресу: https://visualstudio.microsoft.com/ru/downloads/.

Установка Visual Studio для WPF

Чтобы добавить в Visual Studio поддержку проектов для WPF и C# и .NET 7, в программе установки среди рабочих нагрузок нужно выбрать только пункт Разработка классических приложений .NET . Можно выбрать и больше опций или вообще все опции, однако стоит учитывать свободный размер на жестком диске — чем больше опций будет выбрано, соответственно тем больше места на диске будет занято.

Установка компонентов .NET WPF в Visual Studio для C#

После установки среды и всех ее компонентов, запустим Visual Studio и создадим проект графического приложения. На стартовом экране выберем Create a new project (Создать новый проект)

Разработка классических приложений на C# и WPF в Visual Studio

На следующем окне в качестве типа проекта выберем WPF Application :

создание первого проекта WPF на C#

Далее на следующем этапе нам будет предложено указать имя проекта и каталог, где будет располагаться проект.

первый проект WPF на C#

В поле Project Name дадим проекту какое-либо название. В моем случае это HelloApp .

На следующем окне Visual Studio предложит нам выбрать версию .NET, которая будет использоваться для проекта. По умолчанию здесь выбрана последняя на данный момент версия .NET (в моем случае .NET 8.0). Оставим и нажмен на кнопку Create (Создать) для создания проекта.

Версия .NET для проекта WPF на C#

После этого Visual Studio откроет наш проект с созданными по умолчанию файлами:

первый проект WPF на C# в Visual Studio

Структура проекта

Справа находится окно Solution Explorer, в котором можно увидеть структуру нашего проекта. В данном случае у нас сгенерированная по умолчанию структура, которая аналогична той, что создается с помощью .NET CLI:

  • Dependencies — это узел содержит сборки dll, которые добавлены в проект по умолчанию. Эти сборки как раз содержат классы библиотеки .NET, которые будет использовать C#
  • App.xaml задает ресурсы приложения и ряд конфигурационных настроек в виде кода XAML. В частности, в файле App.xaml задается файл окна программы, которое будет открываться при запуске приложения. Если вы откроете этот файл, то можете найти в нем строку StartupUri=»MainWindow.xaml» — то есть в данном случае, когда мы запустим приложение, будет создаваться интерфейс из файла MainWindow.xaml . App.xaml.cs — это файл кода на C#, связанный с файл App.xaml , который также позволяет задать ряд общих ресурсов и общую логику для приложения, но в вид кода C#.
  • AssemblyInfo.cs содержит информацию о создаваемой в процессе компиляции сборке
  • MainWindow.xaml представляет визуальный интерфейс окна приложения в виде кода XAML. MainWindow.xaml.cs — это файл логики кода на C#, связанный с окном MainWindow.xaml . По умолчанию эти файлы открыты в текстовом редакторе Visual Studio. Причем файл MainWindow.xaml имеет два представления: визуальное — в режиме WYSIWIG отображает весь графический интерфейс данного окна приложения, и под ним декларативное объявление интерфейса в XAML. Если мы изменим декларативную разметку, например, определим там кнопку, то эти изменения отображаться в визуальном представлении. Таким образом, мы сможем сразу же получить представление об интерфейсе окна приложения.

Запуск проекта

Чтобы запустить приложение в режиме отладки, нажмем на клавишу F5 или на зеленую стрелочку на панели Visual Studio. И после этого запустится пустое окно по умолчанию.

Первое приложение на WPF и C#

После запуска приложения студия компилирует его в файл с расширением exe. Найти данный файл можно, зайдя в папку проекта и далее в каталог \bin\Debug\net7.0-windows

Сборка и запуск WPF приложения из консоли

Вопрос вроде простой, но я так не понял, как сделать: хочу сделать тоже самое, что делается при запуске/сборке приложения из visual studio , но только при помощи консоли.

Отслеживать
415 2 2 серебряных знака 9 9 бронзовых знаков
задан 11 янв 2020 в 17:49
1,298 13 13 серебряных знаков 22 22 бронзовых знака

То есть Вы хотите собрать WPF из консоли? Попробуйте MSBuild . Примерно что-то наподобие MSBuild project.csproj /p:configuration=Release .

11 янв 2020 в 18:46
– user206435
11 янв 2020 в 22:31

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

В сборке WPF-приложения нет ничего особенного: его можно собрать точно так же, как любое приложение .NET, вызовом MSBuild.

MSBuild MySolution.sln 

Основная сложность, из какого каталога брать MSBuild?

Первый вариант: %WINDIR%\Microsoft.NET\Framework\v4.0.30319 . В этом каталоге MSBuild существует всегда, даже если не установлена Visual Studio (поставляется в составе .NET Framework), но версия позволяет собирать проекты только до C# 5.0.

Второй вариант: из каталога Visual Studio

VS 2017: %ProgramFiles(x86)%\Microsoft Visual Studio\2017\\MSBuild\15.0\Bin

VS 2019: %ProgramFiles(x86)%\Microsoft Visual Studio\2019\\MSBuild\Current\Bin\»

где — редакция: Community, Professional или Enterpise

В данном случае будет поддерживаться версия языка на уровне используемой версии студии.

Запуск приложения WPF с параметрами

Имеется приложение WPF, из которого нужно запустить другое небольшое приложение WPF в виде исполнимого файла (.exe) с параметрами, передаваемыми их главного приложения. Причем при старте второго приложеня происходит проверка, если параметров нет, то стартует еще одно окно, где необходимо их ввести вручную. Делаю так, в файле App:

 public string[] Parameters < get; set; >protected override void OnStartup(StartupEventArgs e)

в главном окне приложения:

 public string Medicament < get; set; >public float Concentration < get; set; >public float SpecGravity < get; set; >public MainWindow() < var parameters = ((App)Application.Current).Parameters; SetParameters(parameters); InitializeComponent(); DataContext = this; TextBoxMg.Focus(); >private void SetParameters(string[] parameters) < if (parameters.Length >0) < Medicament = parameters[0]; if (parameters.Length >= 2) SpecGravity = Convert.ToSingle(parameters[1]); else ShowParametersView(); if (parameters.Length >= 3) Concentration = Convert.ToSingle(parameters[2]); else ShowParametersView(); > else ShowParametersView(); > private void ShowParametersView() < var parametersView = new ParametersView < Medicament = Medicament, SpecGravity = SpecGravity, Concentration = Concentration >; parametersView.ShowDialog(); Medicament = parametersView.Medicament; SpecGravity = parametersView.SpecGravity; Concentration = parametersView.Concentration; > 

Проблема в том, что второе приложение стартует и тут же закрывается. Насколько смог определить, происходит это из-за установки параметров. Если в конструкторе вместо вызова метода SetParameters() вызвать сразу ShowParametersView() , то все прекрасно работает. Что делаю неправильно? P.S. Из консольного приложения запускается без проблем, под отладчиком с параметрами тоже работает

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *