Подтвердить что ты не робот

Какова цель 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 и должен быть создан и отображен другой элемент, если он ничего не делает?

4b9b3361

Ответ 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 или любую другую логику для создания того же пользовательского интерфейса, тогда пользовательский элемент управления переходит к воспроизведению.