Какова цель UserControl?
Зачем нам нужен пользовательский контроль?
Window:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfApplication1="clr-namespace:WpfApplication1">
<wpfApplication1:SaveCloseUserControl />
</Window>
Пользовательский контроль:
<UserControl x:Class="WpfApplication1.SaveCloseUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel Orientation="Horizontal">
<Button Height="30" Content="Save" />
<Button Height="30"
Margin="1"
Content="Cancel" />
</StackPanel>
</UserControl>
Код позади:
public partial class SaveCloseUserControl : UserControl
{
public SaveCloseUserControl()
{
InitializeComponent();
}
}
Я не вижу причин, по которым я должен обернуть StackPanel (или любой другой элемент управления) внутри UserControl, если следующий код без UserControl будет делать то же самое.
Window:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfApplication1="clr-namespace:WpfApplication1">
<wpfApplication1:SaveCloseStackPanel />
</Window>
Панель стека без пользовательского управления:
<StackPanel x:Class="WpfApplication1.SaveCloseUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Orientation="Horizontal">
<Button Height="30" Content="Save" />
<Button Height="30"
Margin="1"
Content="Cancel" />
</StackPanel>
Код позади:
public partial class SaveCloseUserControl : StackPanel
{
public SaveCloseUserControl()
{
InitializeComponent();
}
}
Я использую UserControls везде, но теперь, когда я думаю об этом, они не делают ничего, кроме того, что он обертывает элемент. Поэтому я попробовал это на 10 разных представлениях, и не имеет значения, что это такое, я смог заменить UserControl другими элементами (Grid, ComboBox, GroupBox и т.д.), И все работает точно так же. Поэтому, чтобы быть ясным, если у меня был пользовательский контроль, и первым делом в нем был ComboBox, я удалил UserControl и поставил ComboBox на свое место. Внутри все оставалось, как и в предыдущем примере, с помощью StackPanel.
Почему я даже беспокоюсь с UserControl и должен быть создан и отображен другой элемент, если он ничего не делает?
Ответы
Ответ 1
Цель UserControl
состоит в группе наборе элементов управления в один компонент многократного использования. Они не могут быть оформлены в стиле или шаблоны.
Цель Custom Control
состоит в том, чтобы расширить существующий элемент управления или создать новый элемент управления. Они, в отличие от UserControl
могут быть стилизованными и шаблонами.
Я думаю, вы смешиваетесь с ними.
Итак, вам может быть интересно: "Когда мне следует использовать UserControl
и когда я должен использовать Custom Control
?" и ответ на это зависит.
Вы должны использовать UserControl
, когда вам нужно создать логическую группу элементов управления, которые каким-то образом взаимодействуют, чтобы создать почти композитный элемент управления. Вы должны использовать Custom Control
, если хотите добавить функциональность к существующему элементу управления.
В вашем примере лучше всего использовать UserControl
, так как ваш StackPanel
представляет собой группу элементов управления, сделанных в один многоразовый компонент.
Вы можете узнать немного больше здесь, и здесь.
Ответ 2
Цель UserControl
заключается в том, чтобы помочь вам создать повторно используемые компоненты пользовательского интерфейса, которые можно добавить в панель инструментов, как встроенный элемент управления, начиная с ничего.
Префикс "Пользователь" здесь вроде как "Не из команды WPF". WPF не отправляет какой-либо класс, полученный из UserControl
.
Очень важный аспект UserControls заключается в том, что вы можете проектировать их с помощью XAML (так что они могут быть составными), а также пакетный код + XAML вместе, возможно, в сборке "библиотека", которую вы можете отправить без источника.
Теперь ваши примеры довольно анемичны (без обид:-), они не делают ничего такого интересного, что у меня возникнет соблазн сделать их действительно многоразовыми. В большинстве случаев вы будете создавать UserControls из использования (или опыта), осознав, что повторяете один и тот же шаблон XAML более одного раза, возможно, с несколькими вариантами.
Например, в этом проекте с открытым исходным кодом (Github для Visual Studio): https://github.com/github/VisualStudio/tree/master/src/GitHub.UI/Controls, вы увидите, что они написали некоторые пользовательские элементы управления, как EmojiImage (который происходит от изображения, и ему не нужно XAML), и один UserControl: HorizontalShadowDivider. Зачем? Поскольку HorizontalShadowDivider связан с XAML и, вероятно, используется в нескольких местах.
Ответ 3
Я прочитал где-то из книги (извините забыли название книги...), что UserControl является контейнером "блок-ящик".
Как мое понимание термина и использование вашего примера в качестве основы, вы можете видеть, что производный код StackPanel
ограничен способностью StackPanel размещать две кнопки - которая является горизонтальной или вертикальной. В будущем, если этот макет изменится (возможно, новое требование?), Вам нужно будет создать новый производный класс панели (или переписать существующий) и использовать его, скажем, DockPanel. Это плохо.
В то время как на производном UserControl
все, что вам нужно сделать, это изменить StackPanel на другой тип панели, соответствующий новому требованию.
Это делает блок UserControl блочным, IMHO.
Ответ 4
В соответствии с вашим примером, если вы используете пользовательский контроль только один раз, тогда это не так полезно.
Но в таких сценариях, если какая-то часть дизайна используется столько раз, и каждый раз, когда вы пишете код xaml или любую другую логику для создания того же пользовательского интерфейса, тогда пользовательский элемент управления переходит к воспроизведению.