- Классы отделенного кода XAML
- Метод InitializeComponent()
- Именование элементов
- Управление объявлениями классов и переменных-членов
- IComponent Connector. Initialize Component Метод
- Определение
- Комментарии
- Very Simple definition of InitializeComponent(); Method
- 2 Answers 2
- InitializeComponent не существует в текущем контексте
- Управление одной формой из другой
- 1-й способ. Передача ссылки в public переменную.
- 2-й способ. Передача ссылки в дочернюю форму.
- 3-й способ. Доступ ко всей родительской форме.
Классы отделенного кода XAML
WPF — Основа WPF — Классы отделенного кода XAML
Язык XAML позволяет конструировать пользовательский интерфейс, но для создания функционирующего приложения необходим способ подключения обработчиков событий. XAML позволяет легко это сделать с помощью атрибута Class, показанного ниже:
Префикс пространства имен «x» помещает атрибут Class в пространство имен XAML, что означает более общую часть языка XAML. Фактически атрибут Class сообщает анализатору XAML, чтобы он сгенерировал новый класс с указанным именем. Этот класс наследуется от класса, именованного элементом XML. Другими словами, этот пример создает новый класс по имени MainWindow, который наследуется от базового класса Window.
Класс MainWindow генерируется автоматически во время компиляции. И здесь начинается самое интересное. Вы можете предоставить часть класса MainWindow, которая будет объединена с автоматически сгенерированной частью этого класса. Указанная вами часть — блестящий контейнер для кода обработки событий.
Эта «магия» возможна благодаря средству C#, известному под названием частичные классы (partial class). Частичные классы позволяют разделить класс на две или более отдельных части во время разработки, которые соединяются вместе в скомпилированной сборке. Частичные классы могут применяться во многих сценариях управления кодом, но более всего удобны, когда код должен объединяться с файлом, сгенерированным визуальным конструктором.
Среда Visual Studio оказывает помощь, автоматически создавая частичный класс, куда можно поместить код обработки событий. Например, при создании приложения по имени WpfApplication1, содержащего окно по имени MainWindow. Visual Studio начнет с создания следующего базового каркаса класса:
Во время компиляции приложения код XAML, определяющий пользовательский интерфейс (такой как MainWindow.xaml), транслируется в объявление типа CLR, объединенного с логикой файла класса отделенного кода (подобного MainWindow.xaml.сs), формируя один общий модуль.
Метод InitializeComponent()
В данный момент класс MainWindow не содержит реальной функциональности. Однако он включает одну важную деталь — конструктор по умолчанию, который вызывает метод InitializeComponent(), когда создается экземпляр класса.
Метод InitializeComponent() играет ключевую роль в приложениях WPF. По этой причине никогда не следует удалять вызов InitializeComponent() из конструктора окна. В случае добавления к классу окна другого конструктора обязательно предусмотрите в нем вызов InitializeComponent().
Метод InitializeComponent() не видим в исходном коде, потому что генерируется автоматически при компиляции приложения. По существу все, что делает InitializeComponent() — это вызов метода LoadComponent() класса System.Windows.Application. Метод LoadComponent() извлекает код BAML (скомпилированный XAML) из сборки и использует его для построения пользовательского интерфейса.
При разборе BAML он создает объекты каждого элемента управления, устанавливает их свойства и присоединяет все обработчики событий.
Именование элементов
Есть еще одна деталь, которая должна приниматься во внимание. В классе отделенного кода часто требуется программно манипулировать элементами управления. Например, необходимо читать либо изменять свойства, а также присоединять или отсоединять обработчики событий на лету. Чтобы обеспечить такую возможность, элемент управления должен включать XAML-атрибут Name. В предыдущем примере элемент Grid не содержит атрибут Name, поэтому манипулировать им в отделенном коде не получится.
Ниже показано, как назначить имя элементу Grid:
Можно внести это изменение в документ XAML вручную или выбрать элемент в визуальном конструкторе Visual Studio и установить свойство Name в окне Properties (Свойства).
В обоих случаях атрибут Name сообщит анализатору XAML о необходимости добавить поле следующего вида к автоматически сгенерированной части класса MainWindow:
Теперь с этим элементом можно взаимодействовать в коде класса MainWindow указывая имя MyGrid:
Такая техника мало что дает простому примеру, но становится намного важнее, когда требуется читать значения из элементов управления вводом, таких как текстовые поля и списки.
Показанное ранее свойство Name является частью языка XAML и используется для того, чтобы помочь в интеграции класса отделенного кода. Из-за того, что многие классы определяют собственное свойство Name, происходит некоторая путаница. (Примером может служить базовый класс FrameworkElement, от которого наследуются все элементы WPF.) Анализаторы XAML элегантно справляются с этой проблемой. Можно либо установить XAML-свойство Name (используя префикс х:), либо свойство Name, относящееся к действительному элементу (опустив префикс).
В любом случае результат один и тот же — указанное имя используется в файле автоматически сгенерированного кода и применяется для установки свойства Name.
Это значит, что следующая разметка эквивалентна тому, что вы уже видели:
Такой трюк работает только в том случае, если включающий свойство Name класс оснащен атрибутом RuntimeNameProperty. Атрибут RuntimeNameProperty указывает на то, какое свойство должно трактоваться в качестве имени экземпляра этого типа. (Очевидно, обычно таким свойством является Name.) Класс FrameworkElement содержит атрибут RuntimeNameProperty, так что никаких проблем нет.
В традиционном приложении Windows Forms каждый элемент управления имеет имя. В приложении WPF такого требования нет. Однако при создании окна перетаскиванием элементов на поверхность визуального конструктора Visual Studio каждому элементу назначается автоматически сгенерированное имя. Таково соглашение. Если вы не собираетесь взаимодействовать с элементом в коде, то можете удалить атрибут Name из кода разметки.
Управление объявлениями классов и переменных-членов
Многие из этих ключевых полей вы увидите в действии там, где они понадобятся. Давайте в качестве простого примера рассмотрим следующее определение XAML , в котором используются ключевые слова ClassModifier и FieldModifier, а также x:Name и x:Class:
По умолчанию все определения сгенерированных типов C#/XAML в WPF являются внутренними (internal), а члены — общедоступными (public). Однако на основе показанного определения XAML результирующий автоматически сгенерированный файл содержит тип класса internal с public-членом Button:
IComponent Connector. Initialize Component Метод
Определение
Загружает откомпилированную страницу компонента. Loads the compiled page of a component.
Комментарии
Реализации InitializeComponent являются широко наблюдаемыми в рамках инфраструктуры, предоставляемой платформами или технологиями, которые используют XAML в сочетании с моделями приложений и программирования. Implementations of InitializeComponent are widely observable as part of the infrastructure provided by frameworks or technologies that use XAML combined with application and programming models. Например, при просмотре созданных классов для корневых элементов XAML в страницах и приложениях WPF вы увидите, что они InitializeComponent определены в выходных данных. For example, whenever you look at the generated classes for XAML root elements in WPF pages and applications, you will see InitializeComponent defined in the output. Этот метод также существует в скомпилированной сборке и играет роль в модели приложения WPF загрузки содержимого пользовательского интерфейса XAML во время синтаксического анализа XAML. That method also exists in the compiled assembly and plays a role in the WPF application model of loading the XAML UI content at XAML parse time. Дополнительные сведения об интеграции с WPF InitializeComponent концепции см. в разделе Общие сведения об управлении приложениями , а также код программной части и XAML в WPF. For more information on the WPF integration of the InitializeComponent concept, see Application Management Overview or Code-Behind and XAML in WPF.
Very Simple definition of InitializeComponent(); Method
I have been working through the Head First C# book and have used the InitializeComponent(); method several times.
An example of this is on the Party Planner exercise I created a class called DinnerParty.cs and then used this code in the Form1.cs
My Question is, what exactly is the Initialize Component method doing. My understanding is that I am defining a new object or instance of the DinnerParty class and setting up all the values, so far I have assumed that InitializeComponent() is kind of saying «Set up values of my fields using the following:»
Could I please have a BASIC, something I can get my head around definition. I have looked at previous posts and answers regarding this and everything is too complex. I will mark the easiest to understand response that still has the key information as the answer.
2 Answers 2
InitializeComponent is a method automatically written for you by the Form Designer when you create/change your forms.
Every Forms file (e.g. Form1.cs) has a designer file (e.g. Form1.designer.cs) that contains the InitializeComponent method, the override of the generic Form.Dispose, and the declaration of all of your User Interface objects like buttons, textboxes, labels and the Form itself.
The InitializeComponent method contains the code that creates and initializes the user interface objects dragged on the form surface with the values provided by you (the programmer) using the Property Grid of the Form Designer. Due to this fact do not ever try to interact with the form or the controls before the call to InitializeComponent.
Also, you will find here, the plumbing required to link the controls and form events to the specific event handlers you have written to respond to the user actions.
The code contained in Form1.cs and the Form1.Designer.cs files is part of the same class thanks to the concept of partial classes that could keep two or more files of your code together like a single block of code.
Of course, due to the high numbers of changes executed by the Form Designer, it is a really good advice to not try to modify manually this method, while, sometime, I find useful to add code to the Dispose method with the purpose to destroy some unmanaged objects created in the form lifetime.
InitializeComponent не существует в текущем контексте
Что делать? Подскажте пожалуйста, срочно нужно это решить, такая шляпа в нескольких классах созданных автоматически после создания UserContol xaml файла
P.S. WPF .Net core
Имя не существует в текущем контексте
Всем добрый вечер! Недавно возникла проблема: создала файл wpf( там создается сразу два связанный.
Имя прямоугольника не существует в текущем контексте
Есть элемент типа rectangle c именем rec1. Нужно, чтобы по нажатию кнопки он менял свое свойство.
Не работает функция ReplaceWordStub() — Элемент «ReplaceWordStub» не существует в текущем контексте
Здравствуйте. Подскажите пожалуйста, для экспорта в Word есть функция ReplaceWordStub(), которая в.
InitializeComponent() — Не существует в текущем контексте
InitializeComponent(); пишет не существует в текущем контексте. public Form1() < .
Какой-то геморр с пространствами имён: названия папок совпадающее с типами, разные пhостранства в XAML и в CB и т.п.
По этому коду ничего не скажешь.
Т.е. если создать новый стандартный ‘UserControl’ через мастер и ничего не менять, то ошибка стабильно повторяется?
Или же вы что-то поменяли в XAML?
Вариант наиболее вероятный — вы что-то сами сломали в коде, например, удалили/подредактировали атрибут ‘x:Class’ в разметке.
Вариант маловероятный:
1. Закрыть все экземпляры студии.
2. Из каталога проекта удалить каталоги ‘bin’ и ‘obj’.
3. Снять процесс ‘VBCSCompiler.exe’.
4. Открыть проект снова и попробовать собрать.
Вариант очень маловероятный — у вас какая-то древняя промежуточная превью-версия студии, в которой был какой-нибудь проходной баг, который давно пофиксили.
Что это значит?
То есть, может быть конфликт из-за того, что у меня папка ViewModels содержить папки Lab1,Lab2. И такое же положение дел в папке View и в папке Models
Не знаю, но в списке обновлений есть только «Доступно обновление для «ML.NET Model Builder (Preview)» «
Именно это устал пробовать, щас попробую все 4 пункта
Если у вас корректно установлена VS, если она (и её утилиты) имеет доступ в интернет, и если вы создаёте типовой WPF-проект под .NET Core, то никаких проблем при добавлении нового UC возникать не должно.
Попробуйте, для теста, просто создать типовой (по шаблону VS) WPF-проект с одним главным окном. Собрать его, запустить. Ок. Далее, добавить, через мастер, обычный UserControl. Снова собрать. Если эти сценарии не работают, значит у вас окружение сломано.
Помогло, я еще перед этим VS Istaller зашел, попытался обновить и вдобавок виндовс перезапустил на всякий случай)))
kotelok, Элд Хасп, Посмотрите на вложение, пожалуйста. Я думал ошибка из-за Имя «InitializeComponent» не существует в текущем контексте, но теперь то InitializeComponent работает. Да и почему не существует пространства имен, если внутри студия сама подсказывает что писать даже в пунтке lab3:MainLab3ViewModel студия помогает, но все равно есть ошибки с первого вложения и причем ошибки возникают при попытке компиляции и потом висят как просто ошибки.
Вложение 2 это что будет, если убрать содержимое DataContext, как видно там пропадает почти половина всего UI.
Может вы знаете в чем проблема?
Управление одной формой из другой
Иногда бывает нужно обратиться к элементам какой-то формы из другой в процессе выполнения программы. Например, есть форма Form1, из нее мы открываем другую Form2 и теперь, работая в форме Form2 нужно обратиться, получить доступ к элементам родительской формы Form1. Я нашел несколько способов как это сделать.
1-й способ. Передача ссылки в public переменную.
Перед открытием формы, передаем ссылку на нужный элемент в переменную public вызываемой формы.
В форме Form2 переменная, в которую передавали ссылку, будет теперь соответствовать кнопке button1 из формы Form1
2-й способ. Передача ссылки в дочернюю форму.
Суть примерна та же, то и в 1-м способе. При открытии формы Form2 передаем в нее ссылку на элемент, который планируем потом менять.
Теперь в форме Form2 нужно создать переменную, которая будет содержать ссылку на эту кнопку и через нее будем обращаться к кнопке на Form1 (строки 5,7,9 и 15).
3-й способ. Доступ ко всей родительской форме.
Чтобы осуществить это, нужно внести изменения в нескольких файлах, но зато при этом получим доступ ко всем элементам родительской формы и не нужно передавать ссылку на каждый элемент, как в 1-м способе.
Шаг 1. В файле Program.cs создаем публичную переменную f1 (строка 5).
Шаг 2. Открываем Form1.Designer.cs и в нем у элементов, к которым нужно будет обратиться из другой формы, меняем private на public . Например, сделаем доступной для изменений кнопку button1 на форме Form1.
Шаг 3. При создании формы Form1 присваиваем переменной f1 ссылку на эту форму (строка 7)