zoukankan      html  css  js  c++  java
  • WPF Canvas, how to add children dynamically with MVVM code behind

    reference website : https://stackoverflow.com/questions/5913792/wpf-canvas-how-to-add-children-dynamically-with-mvvm-code-behind

    Requirement:

    To draw one Bitmap Image and rectangle(s) based on the collection of points. The rectangle should exactly fit on the pixels location over the image. There is also some text need to be added inside the rectangle.

    The Image will be always only one and the rectangles will be dynamically added.

    Current Solution:

    Have a canvas with Image Control. Add the the dynamic code under the code behind file 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);
        }
    

    Issue:

    Since i follow MVVM pattern, the collection of points for rectangle is in my ViewModel file ViewImageResultModel.cs. I am not able to add the child rectangle dynamically from the ViewModel file.

    2 Answers

    48
     

    ItemsControl is your friend:

    <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>
    

    The above assumes your VM exposes a collection of points via a Points property, and that each point VM has XYWidth, and Height properties.

    • 2
      Many Thanks Kent. That works fabulous with small change <Canvas IsItemsHost="True" />   Jun 13 '11 at 10:30
    • 2
      That... that is just beautiful.   Feb 28 '12 at 8:54
     
    0

    Added IsItemsHost="True" to the Canvas of Kent's solution:

    <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>
  • 相关阅读:
    linux删除目录的命令
    Windows XP下git通过代理下载android代码
    白话算法希尔排序
    操作系统——存储技术
    如何理解Linus Torvalds的“什么才是优秀程序员”的话
    程序员自我修养读书随笔——目标文件
    面试求职:大数据处理总结
    持久化与Session定义
    java中byte转换int时为何与0xff进行与运算
    OSI七层相关协议
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15303466.html
Copyright © 2011-2022 走看看