Всякий раз, когда вы думаете о создании одного и того же пользовательского интерфейса много раз, вы должны думать с точки зрения шаблонов.
Когда вы хотите, чтобы свойства чего-либо менялись, вы должны думать с точки зрения таблицы данных и связывать их.изменяя вещи на открытое свойство модели представления.
При повторяющихся элементах управления в одной и той же области первым кандидатом должен быть какой-то элемент управления элементами.
В котором есть панель стека, в которой содержится все, ноВы можете легко это изменить.
Для множества вещей на одном холсте вы можете сделать панель элементов управления элементами холстом.
Вам совершенно не нужен пользовательский контроль для инкапсуляции вашей разметки, вы можетепросто имейте табличку с данными.
Создайте модель представления для своих окон.Создайте модель представления для каждой из этих вещей, которую вы хотите воспроизвести (vm).
Свяжите наблюдаемую коллекцию vm с источником элементов управления элементами.
Определите шаблон данных, связанный с этим типом модели представления.
Я работаю в c #, поэтому, вероятно, что-то не так, если я попытаюсь написать код VB.Запустите приведенный ниже код через онлайн-конвертер.
Разметка:
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
<Grid>
<ItemsControl x:Name="ic" ItemsSource="{Binding Items}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type local:StackyVM}">
<StackPanel x:Name="CanvasStack" Background="DimGray">
<CheckBox />
<Border x:Name="CanvasBorder" BorderBrush="Black" BorderThickness="1">
<Canvas Width="150" Height="200" ClipToBounds="True">
<Image x:Name="CanvasImage" Canvas.Left="0" Canvas.Top="0" Stretch="Fill"
Source="{Binding ImageSource}"/>
</Canvas>
</Border>
<TextBlock Text="Test.jpg" />
</StackPanel>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Name="TheCanvas"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Top" Value="{Binding Top}"/>
<Setter Property="Canvas.Left" Value="{Binding Left}"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
Viewmodel per stack
public class StackyVM : BaseViewModel
{
private Double left;
public Double Left
{
get { return left; }
set
{
left = value;
RaisePropertyChanged();
}
}
private Double top;
public Double Top
{
get { return top; }
set { top = value; RaisePropertyChanged(); }
}
public string ImageUrl { get; set; }
}
Добавьте любые другие свойства, которые будут различаться для каждого стека, и свяжите их.Создайте один из них для каждого стека и добавьте его в связанную коллекцию observable: