Silverlight 3.0: как получить дочерние элементы сетки по x: Name?

Предположим, у меня есть XAML, представляющий сетку с некоторыми дочерними элементами, каждый дочерний элемент - это отдельный элемент управления с x: Name. Как мне "получить" эти элементы управления из кода по имени?


person Maciek    schedule 16.08.2009    source источник


Ответы (2)


Если код, который вы пишете, находится в файле кода программной части для файла xaml, Visual Studio должна автоматически сгенерировать переменные-члены, содержащие ссылки на любые именованные элементы в файле xaml. Итак, если у вас есть кнопка с x: Name = "myButton", вы можете получить доступ к этой кнопке через this.myButton.

Если вы хотите сослаться на именованный элемент откуда-то, кроме файла кода программной части, вы можете вызвать FindName в элементе для именованного элемента, например:

Button myButton = myGrid.FindName("myButton") as Button;

где myGrid - это ссылка на рассматриваемую сетку.

person KeithMahoney    schedule 17.08.2009
comment
ух! это работает. Я нашел альтернативу, которая немного сложнее, но тоже работает: private Button myButtnon; foreach (FrameWorkElement fe в myGrid.Children) {if (fe.GetType () == typeof (Button) myButton = fe as Button;} - person Maciek; 17.08.2009
comment
Обратите внимание, что myButton будет полем с внутренней доступностью, поэтому даже из кода вне файла кода программной части вы можете получить к нему доступ, не прибегая к FindName. - person AnthonyWJones; 17.08.2009
comment
если бы вы знали, как долго я искал этот простой ответ! спасибо за прямой вопрос - person Arrie; 28.11.2012

Каждый элемент управления с x: Name имеет поле, созданное для него в частичном классе, который создается для XAML. Это поле имеет внутреннюю доступность. Следовательно, из кода в cs «кода программной части» (почему я ненавижу этот термин?) Вы можете просто использовать имя элемента управления непосредственно в коде для доступа к нему.

person AnthonyWJones    schedule 16.08.2009
comment
Не могли бы вы объяснить это? - person Maciek; 17.08.2009
comment
Я думаю, он имеет в виду, если у вас есть x: Name = MyNamedControl. Как только вы скомпилируете его, файл Reference.g автоматически станет доступен, так что вы можете просто ввести это. - person Paully; 22.08.2009
comment
Но если вы создаете шаблоны, этого не произойдет, и вам следует использовать FindName. - person Paully; 22.08.2009