У меня есть набор элементов управления с прикрепленными командами и логикой, которые постоянно используются таким же образом. Я решил создать пользовательский элемент управления, содержащий все стандартные элементы управления и логику.
Однако мне также нужен элемент управления, чтобы иметь возможность хранить контент, который можно назвать. Я пробовал следующее:
<UserControl.ContentTemplate>
<DataTemplate>
<Button>a reused button</Button>
<ContentPresenter Content="{TemplateBinding Content}"/>
<Button>a reused button</Button>
</DataTemplate>
</UserControl.ContentTemplate>
Однако кажется, что любое содержимое, размещенное внутри пользовательского элемента управления, не может быть названо. Например, если я использую элемент управления следующим образом:
<lib:UserControl1>
<Button Name="buttonName">content</Button>
</lib:UserControl1>
Я получаю следующую ошибку:
Невозможно установить значение атрибута Name «buttonName» для элемента «Button». «Кнопка» находится в области действия элемента «UserControl1», имя которого уже было зарегистрировано, когда оно было определено в другой области.
Если я удалю buttonName, он компилируется, однако мне нужно иметь возможность давать название содержимому. Как я могу этого добиться?
Ответы:
Ответ - не использовать для этого UserControl.
Создайте класс, расширяющий ContentControl
затем используйте стиль, чтобы указать содержимое
и наконец - используйте это
источник
UserControl
на наследованиеContentControl
. Чтобы решить эту проблему, просто добавьте новый класс ( не XAML с CS). И тогда это (надеюсь) сработает. если хотите, я создал небольшое решениеHeadingContainer
иMyFunkyContainer
должно бытьMyFunkyControl
?!Похоже, это невозможно при использовании XAML. Пользовательские элементы управления кажутся излишеством, когда у меня есть все элементы управления, которые мне нужны, но мне просто нужно сгруппировать их вместе с небольшой логикой и разрешить именованный контент.
Решение в блоге JD, как предлагает Маккенир, похоже, имеет лучший компромисс. Способ расширения решения JD, позволяющий определять элементы управления в XAML, может быть следующим:
В моем примере выше я создал пользовательский элемент управления под названием UserControlDefinedInXAML, который определяется как любые обычные пользовательские элементы управления с использованием XAML. В моем UserControlDefinedInXAML у меня есть StackPanel под названием aStackPanel, внутри которого я хочу, чтобы отображался мой именованный контент.
источник
Другой вариант, который я использовал, - просто установить
Name
свойство вLoaded
событии.В моем случае у меня был довольно сложный элемент управления, который я не хотел создавать в коде программной части, и он искал дополнительный элемент управления с определенным именем для определенного поведения, и поскольку я заметил, что могу установить имя в
DataTemplate
Я подумал, что смогу сделать это и наLoaded
мероприятии.источник
Иногда вам может просто потребоваться ссылка на элемент из C #. В зависимости от варианта использования вы можете затем установить
x:Uid
вместо негоx:Name
и получить доступ к элементам, вызвав метод поиска Uid, например Get object, по его Uid в WPF .источник
Вы можете использовать этот помощник для установки имени внутри пользовательского элемента управления:
и ваш Window или Control Code Behind задают вам контроль по свойству:
ваше окно xaml:
UserControlNameHelper получает имя вашего элемента управления и имя вашего класса для установки Control в Property.
источник
Я решил создать дополнительное свойство для каждого элемента, который мне нужен:
Это позволяет мне получить доступ к дочерним элементам в XAML:
источник
Код позади:
Реальным решением для Microsoft было бы исправление этой проблемы, а также всех других проблем со сломанными визуальными деревьями и т. Д. Гипотетически говоря.
источник
Еще один обходной путь: укажите элемент как RelativeSource .
источник
У меня была такая же проблема с использованием TabControl при размещении группы именованных элементов управления.
Мое обходное решение заключалось в использовании шаблона элемента управления, который содержит все мои элементы управления, которые должны отображаться на странице вкладки. Внутри шаблона вы можете использовать свойство Name, а также привязать данные к свойствам названного элемента управления из других элементов управления, по крайней мере, внутри того же шаблона.
В качестве содержимого элемента управления TabItem используйте простой элемент управления и соответственно установите ControlTemplate:
Чтобы получить доступ к названному элементу управления внутри шаблона из кода позади, вам потребуется использовать визуальное дерево.
источник