Подтвердить что ты не робот

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.

Любая помощь очень ценится.

Заранее спасибо

4b9b3361

Ответ 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>