Привязка коллекции геометрий внутри свойства Clip (например, Canvas) к ObservableCollection в ViewModel - PullRequest
0 голосов
/ 11 января 2020

Рассмотрим следующий пример:

<Canvas >
            <Canvas.Clip>
                <CombinedGeometry GeometryCombineMode="Exclude">
                    <CombinedGeometry.Geometry1>
                        <GeometryGroup FillRule="Nonzero">
                            <RectangleGeometry Rect="100 100 100 100" />
                        </GeometryGroup>
                    </CombinedGeometry.Geometry1>
                    <CombinedGeometry.Geometry2>
                        <GeometryGroup FillRule="Nonzero">
                            <RectangleGeometry Rect="150 100 500 500"  />
                        </GeometryGroup>
                    </CombinedGeometry.Geometry2>
                </CombinedGeometry>
            </Canvas.Clip>     
        </Canvas>

Я хотел бы иметь возможность связать коллекцию RectangleGeometries в CombinedGeometry.Geometry2 с ObservableCollection в моем ViewModel, чтобы я мог динамически «пробивать отверстия» в RectangleGeometry CombinedGeometry.Geometry1.

Поскольку невозможно встроить элемент управления в «клип», мне интересно, есть ли другой способ (возможно, все еще используется элемент управления по-другому) для достижения моей цели.

Вся помощь очень ценится.

1 Ответ

0 голосов
/ 11 января 2020

Предполагая, что ваша модель вида имеет свойство ObservableCollection<Rect> Holes для отверстий в геометрии клипа, вы можете добавить другое свойство HolesGeometry, которое возвращает соответствующую геометрию, которая обновляется при каждом изменении свойства отверстий:

public class ViewModel : INotifyPropertyChanged
{
    public ViewModel()
    {
        Holes.CollectionChanged += (s, e) => PropertyChanged?.Invoke(
            this, new PropertyChangedEventArgs(nameof(HolesGeometry)));
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<Rect> Holes { get; } = new ObservableCollection<Rect>();

    public Geometry HolesGeometry
    {
        get => new GeometryGroup
        {
            Children = new GeometryCollection(Holes.Select(r => new RectangleGeometry(r)))
        };
    }
}

Вы бы связали это так:

<CombinedGeometry GeometryCombineMode="Exclude" Geometry2="{Binding HolesGeometry}">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...