WPF Canvas, как динамически добавлять детей с кодом MVVM
Требования:
Нарисовать одно растровое изображение (1024 x 1024 пикселя) и прямоугольник на основе набора точек. Прямоугольник должен точно соответствовать местоположению пикселей над изображением. Также необходимо добавить текст внутри прямоугольника.
Изображение будет всегда только одним, а прямоугольники будут динамически добавлены.
Текущее решение:
Возьмите холст с помощью Image Control. Добавьте динамический код под кодом за файлом ViewImageResult.xaml.cs.
private void DrawResult(int left, int right, int width, int height)
{
Border bord = new Border();
bord.BorderThickness = new Thickness(1);
bord.BorderBrush = Brushes.Red;
bord.Width = width;
bord.Height = height;
_mainCanvas.Children.Add(bord);
Canvas.SetLeft(bord, left);
Canvas.SetTop(bord, right);
}
Вопрос:
Поскольку я следую за шаблоном MVVM, набор точек для прямоугольника находится в моем файле ViewModel ViewImageResultModel.cs. Я не могу добавить дочерний прямоугольник динамически из файла ViewModel.
Любая помощь очень ценится.
Заранее спасибо
Ответы
Ответ 1
ItemsControl
- ваш друг:
<Grid>
<Image Source="..."/>
<ItemsControl ItemsSource="{Binding Points}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding X}"/>
<Setter Property="Canvas.Top" Value="{Binding Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Red" BorderThickness="1" Width="{Binding Width}" Height="{Binding Height}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
Вышеприведенное предполагает, что ваша VM предоставляет набор точек через свойство Points
и что каждая точка VM имеет свойства X
, Y
, Width
и Height
.
Ответ 2
Добавлено IsItemsHost="True"
в Canvas
решения Кента:
<Grid>
<Image Source="..."/>
<ItemsControl ItemsSource="{Binding Points}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding X}"/>
<Setter Property="Canvas.Top" Value="{Binding Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Red" BorderThickness="1" Width="{Binding Width}" Height="{Binding Height}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>