【问题标题】:How to draw dynamic rectangles hierarchical? (MVVM-WPF)如何绘制动态矩形分层? (MVVM-WPF)
【发布时间】:2017-06-30 08:22:30
【问题描述】:

标题解释了我猜的我的问题。我有一个根矩形,它有子矩形,也可以有子矩形。在画布上动态绘制它们的最佳方式是什么?

我的矩形视图模型:

    public class SketchRectangleViewModel:ViewModelBase
    {

        public SketchRectangleViewModel(SketchRectangle sr)
        {
            _id = sr.Id;
            _x = sr.x;
            _y = sr.y;
            _height = sr.Height;
            _width = sr.Width;
            _name = sr.Name;
            _parentId = sr.ParentId;
        }

        private Guid _id;
        private int _x;
        private int _y;
        private int _height;
        private int _width;
        private Guid _parentId;
        private string _name;
        private ObservableCollection<SketchRectangleViewModel> _children = new ObservableCollection<SketchRectangleViewModel>();
        private bool _isSelected;
    }

【问题讨论】:

  • 为什么这被否决了?这是一个合法的问题。
  • 不要担心投票失败,它会发生。试试这个解决方案stackoverflow.com/a/22325266/2745294
  • 每个矩形的X和Y值是父Canvas的坐标还是父矩形的坐标?
  • @mm8 父 Canvas 的坐标,因为我希望能够移动它。
  • @SushilMate 一开始就尝试了该解决方案,但您提供的解决方案并未将孩子添加到画布中

标签: c# wpf canvas mvvm


【解决方案1】:

你可以在你的视图模型中创建一个所有 SketchRectangleViewModel 对象的平面集合:

How to flatten tree via LINQ?

...并将所有SketchRectangleViewModel 对象的集合绑定到ItemsControl

<ItemsControl ItemsSource="{Binding YourCollection}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas Width="100" Height="100" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Left" Value="{Binding X}"/>
            <Setter Property="Canvas.Top" Value="{Binding Y}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Rectangle Width="{Binding Width}" Height="{Binding Height}" Fill="Green" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

注意你只能绑定到SketchRectangleViewModel类的公共属性,所以你需要把你的字段变成属性:

public double X { get; set; }

【讨论】:

  • 抱歉,我还有其他事情要先做,不在电脑前。试过了,它就像一个魅力,谢谢!每当更改 Rectangles 集合或添加新元素时,添加了展平我的集合的调用。
猜你喜欢
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 2012-09-29
相关资源
最近更新 更多