2

我目前正在使用 Caliburn,并且有以下情况。

我有一个 MultiPresenterManager 并且 CurrentPresenter 设置为一个包含 Canvas 的 Presenter。在 Canvas Presenter 视图中,我有一个 ContentControl 与 Content 绑定 ({Binding Canvas}),然后 caliburn 的事件与 ContentControl 挂钩。

我希望能够在画布上移动对象。

我需要 1. 将 Canvas 绑定到视图中的某个元素 2. 将事件(MouseMove、MouseDown)绑定到 Canvas

我似乎无法正确处理这种行为。

有人有什么想法吗?

4

1 回答 1

4

我会推荐一种非常不同的方法,我相信它会达到你想要的结果,但会从你的视图模型中删除任何特定于控制的逻辑。

首先,我们需要一个表示画布上对象的逻辑视图模型。让我们假设它是国家,而画布是地图。也许虚拟机看起来像这样:

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

为简单起见,我省略了 INPC 位。接下来,我们的主视图模型(您问题中的 Presenter)可能如下所示:

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 中。

于 2011-03-11T15:03:03.420 回答