Многоразовая метка WPF и строка текстового поля - PullRequest
0 голосов
/ 16 октября 2018

В моем приложении есть форма, которая содержит много строк
с повторяющимся шаблоном:
Метка и текстовое поле рядом с ней.

   <Grid.ColumnDefinitions>
      <ColumnDefinition Width="4*" />
      <ColumnDefinition Width="6*" />
   </Grid.ColumnDefinitions>

   <Label x:Name="lbl" Content="MyContent" />
   <TextBox Grid.Row="1" Height="20" Width="100" />

Я новичок вwpf, но есть ли способ создать что-то вроде пользовательского элемента управления, который содержит эти два элемента управления вместе?
И каждый раз, когда я просто добавляю этот новый элемент управления и изменяю содержимое метки.

1 Ответ

0 голосов
/ 16 октября 2018

Конечно, есть способ, и он называется UserControl.Просто щелкните правой кнопкой мыши ваш проект и выберите Добавить новый элемент.Затем перейдите к добавлению UserControl, вот пример:

<UserControl x:Class="WpfApp.MyUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:WpfApp"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="4*" />
            <ColumnDefinition Width="6*" />
        </Grid.ColumnDefinitions>

        <Label x:Name="lbl"  />
        <TextBox Grid.Column="1" Height="20" Width="100" />
    </Grid>
</UserControl>

Затем для управления содержимым метки вам понадобится свойство зависимостей , чтобы все, что потребляет ваш пользовательский элемент управления, моглопривязка к нему (вы также можете использовать обычные свойства, но тогда привязка будет невозможна):

public partial class MyUserControl : UserControl
{
    public static readonly DependencyProperty LabelContentProperty = DependencyProperty.Register(
        "LabelContent", typeof(string), typeof(MyUserControl), new PropertyMetadata(default(string),OnLabelContentChanged));

    private static void OnLabelContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = (MyUserControl) d;
        control.lbl.Content = e.NewValue;
    }

    public string LabelContent
    {
        get => (string) GetValue(LabelContentProperty);
        set => SetValue(LabelContentProperty, value);
    }

    public MyUserControl()
    {
        InitializeComponent();
    }
}

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

public partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        InitializeComponent();
    }

    public string LabelContent
    {
        get => lbl.Content as string;
        set => lbl.Content = value;
    }
}

А потом просто используйте это!

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wpfApp="clr-namespace:WpfApp"
        mc:Ignorable="d"
        WindowStartupLocation="Manual"
        Title="MainWindow">
    <Grid>
        <wpfApp:MyUserControl LabelContent="Hi there!"/>
    </Grid>
</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...