aet*_*ste 2 c# wpf xaml mvvm wpf-controls
我正在使用 MVVM 方法在 WPF 中创建一个应用程序。我对这个主题相当陌生,我正在寻找如何实现以下目标的指针:我在 XAML 中创建了一个画布,如下所示:
<canvas name = "myCanvas">
...
</canvas>
Run Code Online (Sandbox Code Playgroud)
我添加了一个按钮,也是在 XAML 中,我想用它在鼠标单击时在现有画布上绘制(以编程方式)一些基本形状(线、矩形等)。由于我使用的是 MVVM 方法,因此按钮的命令必须绑定到一个方法,如下所示:
<Button name="myButton" Command="{Binding myMethod, Mode=OneWay}">
...
</Button>
Run Code Online (Sandbox Code Playgroud)
我让绑定本身正常工作,并在 C# 中创建了绘图和形状,但我不明白如何将形状放在用 XAML 创建的画布上。如何从我的方法中解决在 XAML 中预先制作的画布?我该怎么做?
编辑:
这一点是我想根据数据生成形状以将其可视化。所以,如果我的输入有 3 个类型 A 的元素,我想创建 3 个矩形并将它们显示在画布上。后来我想让它们可点击并在点击时显示有关它们的一些信息。MVVM 对我来说是一个既定的要求。
在你的视图模型中,你应该有一个不使用任何 UI 元素的形状的表示:
public class ShapeItem
{
public Geometry Geometry { get; set; }
public Brush Fill { get; set; }
public Brush Stroke { get; set; }
}
public class ViewModel
{
public ObservableCollection<ShapeItem> ShapeItems { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,您将使用 ItemsControl 和适当的ItemsPanel
并ItemTemplate
可视化形状项:
<ItemsControl ItemsSource="{Binding ShapeItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Path Data="{Binding Geometry}"
Fill="{Binding Fill}"
Stroke="{Binding Stroke}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
视图模型可以如下所示初始化,并且在执行适当的命令方法时可以类似地添加项目:
var vm = new ViewModel();
vm.ShapeItems = new ObservableCollection<ShapeItem>();
vm.ShapeItems.Add(
new ShapeItem
{
Geometry = new EllipseGeometry(new Point(100, 100), 100, 50),
Fill = Brushes.LightBlue
});
vm.ShapeItems.Add(
new ShapeItem
{
Geometry = new RectangleGeometry(new Rect(150, 100, 200, 100)),
Fill = Brushes.Azure,
Stroke = Brushes.Black
});
DataContext = vm;
Run Code Online (Sandbox Code Playgroud)