gpt4 book ai didi

c# - 以编程方式寻址在 xaml 中创建的 Canvas

转载 作者:行者123 更新时间:2023-11-30 20:48:09 25 4
gpt4 key购买 nike

我正在使用 MVVM 方法在 WPF 中创建一个应用程序。我对这个主题相当陌生,我正在寻找如何实现以下目标的指示:我在 XAML 中创建了一个 Canvas ,如下所示:

<canvas name = "myCanvas">
...
</canvas>

我添加了一个按钮,也是在 XAML 中,我想用它在鼠标单击时(以编程方式)将一些基本形状(直线、矩形等)绘制到现有 Canvas 上。由于我使用的是 MVVM 方法,因此按钮的命令必须绑定(bind)到一个方法,如下所示:

<Button name="myButton" Command="{Binding myMethod, Mode=OneWay}">
...
</Button>

我让绑定(bind)本身正常工作,并且我在 C# 中创建了绘图和形状,但我不明白如何将这些形状放到在 XAML 中创建的 Canvas 上。如何从我的方法中处理在 XAML 中预制的 Canvas ?我该怎么做?

编辑:

这里的重点是我想根据数据生成形状以将其可视化。所以,如果我的输入有 3 个 A 类型的元素,我想创建 3 个矩形并将它们显示在 Canvas 上。稍后我想让它们可以点击并在点击时显示一些关于它们的信息。 MVVM 是我的既定要求。

最佳答案

在您的 View 模型中,您应该具有不使用任何 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; }
}

然后,您将使用带有适当 ItemsPanelItemTemplate 的 ItemsControl 来可视化形状项目:

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

View 模型可能会如下所示初始化,并且当执行适当的命令方法时可能会类似地添加项目:

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;

关于c# - 以编程方式寻址在 xaml 中创建的 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25025539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com