2016-02-19 42 views
0

让我首先说明问题。我想实现Canvas的封装(让我称之为Page),它将实现围绕其实际选择的UIElements选择矩形。 为此,我实现I选择界面,如下所示:通过用户控件动态选择矩形

interface ISelect { 
    Point Center {get; set;} //Center of selecting rectangle 
    Size Dimensions {get; set;} //Dimensions of selecting rectangle 
} 

是放在页中的每个对象实现I选择界面。 页面包含ObservableCollection类型的SelectedElements,它保存对当前选定元素的引用。

对于SelectedElements中的每个条目,我想围绕它绘制矩形。

我有一些想法,如何做到这一点:

  1. 每天的UIElement可以自行实施该矩形选择时表现出来。这个选项需要每次都有新的对象来实现。所以我宁愿不使用它。
  2. 页面我可以在代码隐藏中创建矩形,并将它们添加到页面中。这不是MVVM推荐的原理。
  3. 在页面XAML创建类似ItemsControl的后台,并将其绑定到SelectedElements与特定的模板。这个选项对我来说似乎是最好的选择。请帮助我这个方向。我应该以某种方式使用ItemsControl?

谢谢。

+0

搜索装饰物(可视化选择)。或者,如果您更喜欢单独选择,那么不必直接将视觉效果添加到'Canvas',而是将每个内部的'Border'(使用数据模板)放置在视觉的视图模型的IsSelected属性中。 – Sinatr

+0

嗨。感谢您的快速响应。你有什么方法吗? – ZgHrvoje

回答

0

我没有时间去挖掘一个完整的工作解决方案,所以这主要是一些建议的集合。

每个元素应该有视图模型

public abstract class Element: INotifyPropertyChanged 
{ 
    bool _isSelected; 
    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set 
     { 
      _isSelected = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

public class EllipseElement : Element {} 
public class RectangleElement : Element {} 

再就是数据模板可视化元素(我不能给你转换代码,但你可以用另一个替换它,看here)。

<DataTemplate DataType="{x:Type local:EllipseElement}"> 
     <Border Visibility="{Binding IsSelected, Converter={local:FalseToHiddenConverter}}"> 
      <Ellipse ... /> 
     </Border> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type local:RectangleElement}"> 
     <Border Visibility="{Binding IsSelected, Converter={local:FalseToHiddenConverter}}"> 
      <Rectangle ... /> 
     </Border> 
    </DataTemplate> 

然后结合元件以帆布的ObservableCollection(这是棘手的,见this答案,其中ItemsControl用于支持绑定)。

您的选择例程必须命中测试元素并设置/重置它们的IsSelected属性,该属性将显示边框。有关如何绘制全部选择矩形的信息,请参阅here

+0

再次感谢您。 – ZgHrvoje