gpt4 book ai didi

c# - 使多边形资源独一无二

转载 作者:太空宇宙 更新时间:2023-11-03 19:53:19 25 4
gpt4 key购买 nike

Possible Duplicate:
WPF accesses only single instance of derived class with dependency property

我在 XAML 文件中将多边形定义为我的 UserControl 的资源:

<UserControl.Resources>
<Polygon x:Key="MyPolygon">
<Polygon.Points>
...
</Polygon.Points>
</Polygon>
</UserControl.Resources>

并希望创建此元素的多个(但单独的)实例并将它们添加到 Canvas 中。

Polygon polygon = (Polygon) this.Resources["MyPolygon"];
// ...
canvas.Children.Add(polygon);

通过重复运行上述代码第二次添加多边形时,抛出以下错误:

Specified Visual is already a child of another Visual or the root of a CompositionTarget.

可能的解决方案是:

  • 克隆多边形,这不是最优雅的方式
  • 从代码生成多边形

有没有更好的解决方案可以利用 Resources 属性(或一种可实例化的多边形)?

最佳答案

XAML 中的“可实例化多边形”是一个带有 Polygon 的模板。在里面。无论你需要多边形在哪里,放一个 ContentControl在那里并将模板应用于它。

如果您在 XAML(而不是代码隐藏)中执行所有这些操作,生活就会轻松很多。

<UserControl.Resources>
<DataTemplate x:Key="MyPolygonTemplate">
<Polygon>
<Polygon.Points>
...
</Polygon.Points>
</Polygon>
</DataTemplate>
</UserControl.Resources>

<Grid>
<Canvas>
<ContentControl
ContentTemplate="{StaticResource MyPolygonTemplate}"
/>
</Canvas>
</Grid>

如果您需要创建任意数量的它们,请使用 ItemsControlCanvas为其 ItemsPanel , 然后放一个 Polygon ItemTemplate 对于 ItemsControl .填充 ItemsControl , 你会绑定(bind)它的 ItemsSourceObservableCollection<T>您的 View 模型的属性。该集合将包含您的多边形事物要在视觉上表示的任何数据项对象。如果你需要十个多边形飞来飞去,把十个东西放在收藏里,然后宾果游戏,它们就在那里。抽出一个,UI 将只显示剩余的九个。要定位它们,请绑定(bind) Canvas.LeftCanvas.Top到数据项类的适当属性(必须实现 INotifyPropertyChanged )(您可能必须通过 an ItemContainerStyle 应用这些属性;我对 Canvas 做的不多)。

您实际上不必使用 ContentControlContent属性(property),如果没有必要。但是你可以使用 Content通过 Polygon不同套Points来自数据项类,如果你愿意的话。

这是一个常见问题的副本; I answered it yesterday too .

关于c# - 使多边形资源独一无二,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36225035/

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