Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Обращение к xaml объектам из класса  [new]
archelite
Member

Откуда:
Сообщений: 48
Добрый день

подскажите пожалуйста как правильно обращаться к объектам определенным в xaml из кода, который не связан с ним напрямую,
т.е. мы просто создаем сторонний класс в том же пакете и из него нужно изменить надпись в объекте Label.
13 июл 16, 15:14    [19404771]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к xaml объектам из класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21949
обращаться к xaml-объектам из кода не правильно в принципе. Курите MVVM.

archelite
из него нужно изменить надпись в объекте Label.
Привязать Label.Text к свойству модели. Менять свойство.
13 июл 16, 15:23    [19404811]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к xaml объектам из класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4031
archelite,

не совсем понял сути вопроса.

Каждый элемент XAML кода представляет из себя обычный класс, если мы говорим про элементы визуального дерева, то это скорее всего классы наследованные от UIElement или если смотреть более глубоко то Visual. Если речь идет об элементах находящихся в ресурсах визуального дерева, то это может быть совершенно любой тип.
Для UIElement'ов можно определить имя через свойство x:Name="Имя элемента"
Для ресурсов задается ключ x:Key="Ключ ресурса". Ключём ресурса может выступать объект любого типа, а не обязательно строка. А в некоторых случаях его можно не указать и он будет назначен по умолчанию (например для стилей из свойства TargetType)

Обратиться к элементам можно:
а) по имени, с помощью метода FindName(string), но только если вы находитесь в области видимости этого объекта. То есть, если вы ищете объект "TextBox1" в классе окна.
Либо, просто как в WF по имени TextBox1.Text = "";
б) по имени элемента шаблона методом GetTemplateChild(string). Часть элемента шаблона можно получить только в самом элементе управления, для которого этот шаблон определен. Делать это нужно из переопределенного метода OnApplyTemplate, это гарантирует то, что объект будет создан на момент его поиска.
в) с помощью метода FindResource или TryFindResource для поиска объекта определенного в ресурсах. Поиск осуществляется в визуальном дереве, в ресурсах окна, приложения и сборки
г) с помощью VisualTreeHelper можно найти любой элемент визуального дерева, осуществляя поиск рекурсивно вверх и вниз.
д) с помощью Binding'а, можно задать свойству другого элемента управление ссылка на нужный элемент через {Binding ElementName=TextBox1} или с помощью поиска по визуальному дереву {Binding RelativeSource={RelativeSource ...}}
Но, все выше перечисленные методы используются только в рамках View, то есть на уровне элементов управления. Лично я, по большей части стараюсь избегать именования объекта в XAML, только если мне действительно нужно его найти.
13 июл 16, 16:28    [19405141]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к xaml объектам из класса  [new]
archelite
Member

Откуда:
Сообщений: 48
Всем спасибо, разобрался, сделал.

Доступ можно получить например так

static wImp currWindow = (wImp) System.Windows.Application.Current.Windows[1];

wImp наш сторонний класс, который отвечает за обработку определенной инфы, полученной из формы.
(wImp) System.Windows.Application.Current.Windows[1] - получаем массив окон приложения, где 0-главное окно приложения, 1 - второй уровень и т.д. В моем случае нужен был второй уровень. Приводим полученный объект к нужному типу и пользуемся)
14 июл 16, 16:52    [19410201]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к xaml объектам из класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4031
archelite
Всем спасибо, разобрался, сделал.

Доступ можно получить например так

static wImp currWindow = (wImp) System.Windows.Application.Current.Windows[1];

wImp наш сторонний класс, который отвечает за обработку определенной инфы, полученной из формы.
(wImp) System.Windows.Application.Current.Windows[1] - получаем массив окон приложения, где 0-главное окно приложения, 1 - второй уровень и т.д. В моем случае нужен был второй уровень. Приводим полученный объект к нужному типу и пользуемся)

жуть, а если 2ым окном будет не wImp, а другое? то тогда, что?
14 июл 16, 17:03    [19410250]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к xaml объектам из класса  [new]
archelite
Member

Откуда:
Сообщений: 48
Roman Mejtes
жуть, а если 2ым окном будет не wImp, а другое? то тогда, что?


создадим ссылку и на него) мне нужно сделать небольшую формочку для отчетов, так что городить громоздкий абстрактный лес нет особого смысла, хотя конечно в будущем для серьезных проектов придется разобраться
14 июл 16, 17:45    [19410402]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к xaml объектам из класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4031
вот с такого, извините за выражение, "говнокода" и начинаются траблы, а потом будет уже поздно.
Всё нужно сразу делать нормально, хотя бы просто "потому что" :)
я практически 24 часа в сутки на WPF кодю и за всё время работы, я не разу не искал окна и тем более не делал ссылку на них статической.
С окнами действительно есть некоторые геморои, особенно если используешь MVVM шаблон, но всё это решается написанием WindowManager'а или используя существующий.
14 июл 16, 18:48    [19410669]     Ответить | Цитировать Сообщить модератору
 Re: Обращение к xaml объектам из класса  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
archelite
Добрый день

подскажите пожалуйста как правильно обращаться к объектам определенным в xaml из кода, который не связан с ним напрямую,
т.е. мы просто создаем сторонний класс в том же пакете и из него нужно изменить надпись в объекте Label.
Искать через VisualTreeHelper или LogicalTreeHelper.

Примеры
15 июл 16, 06:02    [19412047]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить