Сначала пара нот:
- A
UserControl
- это тип ContentControl
.Это означает, что вы не можете передать дочерний элемент в UserControl.Вы можете переопределить содержимое, но это бесполезно для того, чего вы хотите достичь. - Если вам нужен элемент управления, содержащий дочерний элемент SINGLE , вы ищете
Decorator
класс. - Если вам нужен элемент управления, который содержит MULTIPLE дочерние элементы, вы ищете класс
ItemsControl
.
Итак, в основном вы делаете это неправильно.При этом есть несколько способов выполнить то, что вы хотите.Вы можете просто использовать ItemsControl и переопределить шаблон своим собственным шаблоном.Вы также можете создать CustomControl, который наследуется от ItemsControl или Decorator.
Переопределение шаблона (как стиля) будет более простым способом сделать это, поэтому я предлагаю сделать это, если вы не очень хорошо-обращено в том, как создать пользовательский элемент управления WPF правильно .
Если вы решили использовать пользовательский элемент управления, похоже, что вы, вероятно, захотите сделать это в качестве декоратора(просто догадываюсь, что вы бы хотели одного ребенка здесь).Раздражает то, что для создания хорошо написанного пользовательского элемента управления WPF вам понадобятся действительно хорошие навыки.Например, Border
- это тип Decorator, который содержит несколько DependencyProperty
свойств.Шаблон поставляется с PresentationFramework.dll (я думаю), так что он имеет внешний вид по умолчанию.Граница (пользовательский элемент управления) не является , которую трудно написать.Что очень раздражает, так это когда вы действительно хотите иметь логику взаимодействия.Вам нужно будет ввести проверки и противовесы, чтобы убедиться, что вы получаете контрольные ссылки из шаблона.Тогда и только тогда, если ссылки не равны нулю, вы можете перейти к своей логике.В основном, скажем, вы написали тип пользовательского элемента управления, который имеет 2 кнопки для выполнения логики, и вы предоставили шаблон по умолчанию, где кнопки называются «Кнопка 1» и «Кнопка 2».Вы не можете просто вытянуть кнопку 1 и кнопку 2 из шаблона и ожидать, что они будут там;кто-то может легко переопределить ваш шаблон по умолчанию и удалить Button 1 и Button 2, делая ваш пользовательский элемент управления бесполезным (в значительной степени).Что делает это ужасным, так это если вы закодировали без учета этих ситуаций.Ваш пользовательский контроль столкнется с NullReferenceException
с.Не говоря уже о том, что вам нужно будет соединить вещи, чтобы разрешить привязку команды к кнопке PER, и вы должны также предоставить routedevent для каждой кнопки.По сути, пользовательский элемент управления может быть слишком большим для того, что вы хотите сделать (возможно).
Я могу ошибаться, вы можете быть очень опытным и знать, как использовать пользовательские элементы управления.Или, что еще лучше, вы, возможно, просто хотели просто украсить свой ItemsControl, скажем, добавив баннер вверху?Я не знаю, но я уверен, что вы делаете:)
В целом, я бы посмотрел, как переопределить шаблон ItemsControl.Вот пример:
<Window x:Class="Sample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480">
<Window.Resources>
<Style x:Key="ItemsControlStyle1" TargetType="{x:Type ItemsControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ItemsControl}">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
<StackPanel Orientation="Vertical">
<TextBlock Text="A HEADER!" />
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid x:Name="LayoutRoot">
<ItemsControl Style="{DynamicResource ItemsControlStyle1}" />
</Grid>
</Window>