Как переименовать mainwindow wpf
Перейти к содержимому

Как переименовать mainwindow wpf

  • автор:

Лучший способ переименовать MainWindow

Спасибо за указатель на ReSharper Anurag. Не знал об этом. К сожалению, я использую Visual C # 2010 Express, который, похоже, не поддерживается ReSharper.

dharmatech 04 апр. 2012, в 18:40

@dharmatech Отредактировано :). Да, Express не поддерживает надстройки. Если вы действительно хотите, чтобы это было проще, вы можете попробовать SharpDevelop . У меня нет опыта с этим, но я прочитал хорошие вещи.

Raj Ranjhan 04 апр. 2012, в 18:54
Показать ещё 2 комментария

Visual С# 2010 Express Имеет встроенную опцию для решения этой проблемы. Вы можете видеть, что в строке меню есть опция «Рефакторинг», где вы можете увидеть два подменю «Переименовать» и «Refactor». Чтобы изменить любое имя, которое вы просто должны принять, наведите курсор на имя (Calculater в изображении) и нажмите правую кнопку. Затем перейдите в Refactor и нажмите «Rename». Появится диалоговое окно, а затем вы добавите новое имя, которое вы хотите передать своему атрибуту.

Изображение 514951

Ashad Shanto 19 апр. 2012, в 21:13
Поделиться

Здравствуйте @MohammadAsad. Да, эта функция переименует метод. Однако, похоже, что в случае MainWindow вам все равно придется StartupUri вручную. Но хорошо, что вы упомянули эту функцию для полноты.

dharmatech 19 апр. 2012, в 21:36

Это на самом деле хорошо работает, если вы делаете все в правильном порядке. 1. Refactor / Rename class 2. Переименуйте файл в Solution Explorer 3. Замените StartupUri в App.xaml новым именем

jsmith 19 нояб. 2015, в 14:48

Я не могу придумать лучшего способа. Альтернативой, которая может привести к меньшему количеству шагов, может быть создание нового окна, а затем установка StartupUri на имя вашего нового окна.

Это зависит от вас, хотите ли вы сохранить MainWindow или удалить его (что имеет смысл, если вы вообще не используете его).

Как изменить public переменную из другой страницы (WPF)?

Может я что-то делаю не правильно? Тогда каким способом сделать одни переменные на все страницы, которые еще и можно будет изменять?
Спасибо огромное за помощь!

  • Вопрос задан более трёх лет назад
  • 1498 просмотров

Комментировать
Решения вопроса 1

Dywar

Оператор new, почитайте.
Вы создаете новый экземпляр, и изменяете или читаете значение только в нем.

Модификатор static.
Позволит сделать объект в единственном экземпляре и разделяемым.

Ответ написан более трёх лет назад
Нравится 2 4 комментария
Wolfak @Wolfak Автор вопроса

Я это понимаю. Как тогда реализовать данную возможность изменения переменной? Нужно сохранение переменной на протяжение всей работы программы (всех страниц) Желательно нескольких переменных.

Nipheris

Станислав Макаров @Nipheris Куратор тега C#

Wolfak: вам MrDywar Pichugin объяснил смысл — либо держите объект или значение в статик-поле на протяжении работы всей программы, либо передаете ОДИН И ТОТ ЖЕ объект с вашим полем в те места, где его нужно использовать. Вообще, стоит вытащить эту переменную и вообще все предметные данные из формы в отдельный модельный объект, в нем все хранить и его передавать куда нужно.

Вы бы с языком поближе познакомились сначала, а раз уж за WPF взялись, так про MVVM почитайте. Например, публичные поля во многих случаях залог для потенциальных проблем в дальнейшей разработке,было бы неплохо обернуть в свойство.

Хостирование приложения и внедрение зависимостей

Хостинг приложения WPF представляет его развертывание в рамках некоторого хоста. Грубо говоря, хост представляет контейнер, который позволяет управлять, настраивать и запускать приложение. В рамках платформы .NET хост представлен классом Microsoft.Extensions.Hosting.Host , который позволяет воспользоваться некоторыми интересными возможностями, как, например, внедрение зависимостей

Итак, возьмем новый стандартный проект WPF. По умолчанию он имеет класс App, который представляет приложение, связанный с ним файл App.xaml , а также код главного окна MainWindow в файлах MainWindow.xaml и MainWindow.xaml.cs .

Хостирование приложения WPF на C#

Стандартная модель приложения выглядит следующим образом — запускается приложение — класс App, а он запускает класс окна MainWindow. Теперь изменим эту модель, добавив хостирование приложения. Для этого вначала добавим через пакетный менеджер nuget пакет Microsoft.Extensions.Hosting . Затем добавим в проект новый класс, который назовем Program и в котором определим следующий код:

using Microsoft.Extensions.Hosting; using Microsoft.Extensions.DependencyInjection; using System; public class Program < [STAThread] public static void Main() < // создаем хост приложения var host = Host.CreateDefaultBuilder() // внедряем сервисы .ConfigureServices(services =>< services.AddSingleton(); services.AddSingleton(); >) .Build(); // получаем сервис - объект класса App var app = host.Services.GetService(); // запускаем приложения app?.Run(); > >

Теперь мы делегируем создание приложения WPF классу Host . Для создания хоста необходим класс-строитель, который реализует интерфейс IHostBuilder и который возвращается методом Host.CreateDefaultBuilder() . По умолчанию этот метод возвращает встроенную реализацию в виде класса HostBuilder.

IHostBuilder hostBuilder = Host.CreateDefaultBuilder();

Далее у HostBuilder для настройки сервисов приложения вызывается метод ConfigureServices() :

.ConfigureServices(services => < services.AddSingleton(); services.AddSingleton(); >);

Метод ConfigureServices принимает делегат, параметр которого представляет объект IServiceCollection — коллекцию сервисов. Благодаря добавления сервисов в эту коллекцию мы можем затем получить добавленные сервисы в любом месте приложения.

Для добавления сервисов применяется метод services.AddSingleton() , который добавляет сервис в виде синглтона. Метод типизируется типом добавляемого сервиса. То есть в данном случае мы добавляем сервисы App и MainWindow. Это значит, что приложение будет создавать объекты-синглтоны App и MainWindow при обращении к ним. И при каждом получении объектов этих классов мы по сути будем получать один и тот же объект. Что впрочем логично, поскольку объект приложения App должен существовать в единственном виде. Обычно то же самое касается и главного окна приложения.

Затем создаем хост — объект IHost с помощью метода Build() объекта IHostBuilder

Далее получаем из коллекции сервисов объект App:

var app = host.Services.GetService();

И с помощью метода Run() запускаем приложение:

app?.Run();

Настройка класса App

Теперь настроем класс App. Прежде всего удалим файлы App.xaml и App.xaml.cs и добавим в проект новый класс App со следующим содержанием:

using System.Windows; public class App : Application < readonly MainWindow mainWindow; // через систему внедрения зависимостей получаем объект главного окна public App(MainWindow mainWindow) < this.mainWindow = mainWindow; >protected override void OnStartup(StartupEventArgs e) < mainWindow.Show(); // отображаем главное окно на экране base.OnStartup(e); >>

Внедрение зависимостей в класс App в приложении на WPF и C#

Поскольку мы добавили класс главного окна MainWindow в сервисы приложения, то мы можем получить этот сервис в любом месте приложения в том числе через параметр конструктора — в данном случае конструктора класса App. Здесь сохраняем объект MainWindow в переменную и в методе OnStartup, который запускается при старте приложения, с помощью метода mainWindow.Show() отображаем окно на экране.

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

Внедрение зависимостей в приложении на WPF и C#

Создание и внедрение сервисов

Подобным образом мы можем внедрять в приложение WPF и другие сервисы. Рассмотрим на примере. Определим в файле Program.cs следующий код:

using Microsoft.Extensions.Hosting; using Microsoft.Extensions.DependencyInjection; using System; public class Program < [STAThread] public static void Main() < var host = Host.CreateDefaultBuilder() .ConfigureServices(services =>< services.AddSingleton(); services.AddSingleton(); // добавляем сервис IDateService services.AddTransient(); >) .Build(); var app = host.Services.GetService(); app?.Run(); > > public interface IDateService < string FormatedDate < get; >> public class RuDateService : IDateService < public string FormatedDate =>$"Сегодня: "; > public class EnDateService : IDateService < public string FormatedDate =>$"Today: "; >

Для теста здесь определен сервим-интерфейс IDateService, в котором свойство FormatedDate будет возвращать отформатированную текущую дату.

Также определены две реализации этого интерфейса. Одна реализация — класс RuDateService через свойство FormatedDate возвращает дату на русском языке, а вторая реализация EnDateService возвращает дату на английском языке.

С помощью метода AddTransient сервис IDateService внедряется в приложение, причем при обращении к этому сервису будет использоваться реализация RuDateService:

services.AddTransient();

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

public partial class MainWindow : Window < IDateService dateService; public MainWindow(IDateService dateService) < this.dateService = dateService; InitializeComponent(); >private void Button_Click(object sender, RoutedEventArgs e) < MessageBox.Show(dateService.FormatedDate); >>

Здесь мы получаем в конструкторе сервис IDateService. Причем мы точно не знаем, какая именно реализация будет использоваться для этого сервиса. Затем в методе Button_Click, который будет обработчиком кнопки, отображаем окно с датой из сервиса.

И в конце добавим в код xaml в файле MainWindow.xaml код кнопки, по нажатию на которую будет вызываться вышеопределенный метод Button_Click:

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

как в wpf изменить стартовое окно с MainWindow на другое?

Я думаю, что MainWindow вам и нужно реализовать как окно Login, а затем создать другие необходимые окна или фреймы.

7 фев 2017 в 10:53

Вот простой и достаточный ответ: Change Startup Window Не будет лишней вот эта ссылка: WPF — choose startup window based on some condition.

7 фев 2017 в 11:16

2 ответа 2

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

В файле App.xaml в поле StartupUri .

Это если при старте приложения, а вообще MainWindow оно на то и Майн — чтоб основная работа приложения в нем была, грузитесь, а потом поверх (или внутри раз у нас WPF) пораждаете диалог с запросом логина и пароля — и дальше работаете.

Отслеживать
ответ дан 7 фев 2017 в 11:06
3,496 11 11 серебряных знаков 25 25 бронзовых знаков
так и сделаю, спасибо
7 фев 2017 в 11:53

Я думаю, ваш вопрос можно решить следующим образом. Сперва, в public MainWindow() вы прописываете код, который предоставлен в данном ответе на Stack. На форму Login помещайте TextEdit для ввода логина и пароля. Button, который проверит валидность и закроется только в том случае, если всё верно.
Так же, для примеров работы с окнами в WPF вы можете прочитать:

Лично я предпочитаю фреймы окнам. Так практичнее.

Отслеживать
ответ дан 7 фев 2017 в 11:10
801 2 2 золотых знака 11 11 серебряных знаков 26 26 бронзовых знаков

  • c#
  • wpf
  • visual-studio
    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

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

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