Переплет холста в Калибурне - PullRequest
2 голосов
/ 10 февраля 2011

В настоящее время я использую Caliburn, и у меня есть следующий сценарий.

У меня есть MultiPresenterManager, и CurrentPresenter установлен на Presenter, который содержит Canvas.в представлении Canvas Presenter у меня есть ContentControl с ограниченным содержимым ({Binding Canvas}), а затем события закалываются для ContentControl.

Я хочу иметь возможность перемещать объекты на холсте.

Мне нужно 1. Привязать Canvas к некоторому элементу в представлении 2. Привязать события (MouseMove, MouseDown) к Canvas

Кажется, я не могу понять, как это работает.

У кого-нибудь есть идеи?

1 Ответ

4 голосов
/ 11 марта 2011

Я бы порекомендовал совершенно другой подход, который, как я считаю, будет иметь ту же цель, что и вы, но удалит любую логику, специфичную для управления, из ваших моделей.

Во-первых, нам понадобится модель логического представления,представляет объекты на холсте.Давайте представим, что это страны, а холст - это карта.Возможно, виртуальная машина будет выглядеть так:

public class Country : PropertyChangedBase {
    public string Name {get;set;}
    public double X {get;set;}
    public double Y {get;set;}
}

Я упустил биты INPC для простоты.Затем наша основная модель представления (докладчик из вашего вопроса) может выглядеть следующим образом:

public class Map : PropertyChangedBase  {
    public ObservableCollection<Country> Countries {get;set;}    
}

Мы поместим красную точку на холсте для каждой страны.Если это так, то ваш соответствующий XAML может выглядеть так (без корневого элемента):

<ItemsControl ItemsSource="{Binding Countries}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Ellipse Fill="Red"
                     Width="16"
                     Height="16"
                     Canvas.Top="{Binding Y}"
                     Canvas.Left="{Binding X}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Если вам нужно обрабатывать события, просто подключите их в XAML как обычно.

...