В моем приложении есть форма, содержащая много строк
с повторяющейся выкройкой:
Ярлык, а затем текстовое поле рядом с ним.
<Grid.ColumnDefinitions>
</Grid.ColumnDefinitions>
Я новичок в wpf, но есть ли способ создать что-то вроде пользовательского элемента управления, который содержит эти два элемента вместе?
И каждый раз я просто добавляю этот новый элемент управления и изменяю содержимое метки.
Конечно, способ есть, и он называется 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>