首页 文章

动态选择用户控件上的矩形

提问于
浏览
0

让我先说明问题 . 我想在Canvas周围实现包装器(让我称之为Page),它将实现选择实际选择的UIElements周围的矩形 . 为此,我实现了ISelect接口,如下所示:

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

放到Page的每个对象都实现了ISelect接口 . Page具有ObservableCollection类型的SelectedElements,它保存对所有当前所选元素的引用 .

对于SelectedElements中的每个条目,我想在它周围绘制矩形 .

我几乎没有想法如何做到这一点:

  • 每个UIElement都可以自己实现这个矩形并在选中时显示它 . 此选项需要新对象每次都实现此目的 . 所以我宁愿不使用它 .

  • 在页面中,我可以在代码隐藏中创建矩形,并将它们添加到页面中 . 它不是MVVM推荐的原则 .

  • 在页面XAML中创建一些类似ItemsControl的背后,并使用特定模板将其绑定到SelectedElements . 这个选项对我来说似乎是最好的选择 . 请帮我这个方向 . 我应该以某种方式使用ItemsControl?

谢谢 .

1 回答

  • 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 answer,其中 ItemsControl 用于支持绑定) .

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

相关问题