Холст 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>