Холст WPF, как динамически добавлять детей с кодом MVVM позади
требования:
чтобы нарисовать одно растровое изображение (1024 x 1024 пикселей) и прямоугольник(ы) на основе коллекции точек. Прямоугольник должен точно соответствовать местоположению пикселей над изображением. Существует также некоторый текст, который необходимо добавить внутри прямоугольника.
изображение всегда будет только одним, и прямоугольники будут динамически добавлены.
Текущее Решение:
есть холст с контролем изображения. Добавить динамический код под код файла ViewImageResult.код XAML.цезий.
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, коллекция точек для прямоугольника находится в моем файле Viewimageresultmodel.цезий. Я не могу динамически добавлять дочерний прямоугольник из файла ViewModel.
любая помощь очень ценится.
спасибо заранее
2 ответов
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>
выше предполагается, что ваша виртуальная машина предоставляет коллекцию точек через Points
свойство, и что каждая точка VM имеет X
, Y
, Width
и Height
свойства.
добавил 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>