C# Windows Phone-如何在动态创建的画布中绘制形状-XAML与代码隐藏
我有一个longListSelector,它可以动态创建多个画布,我想使用ObservableCollection游戏中的数据在每个画布中绘制。 以下是主页的基本代码: 公共类GameVM:INotifyPropertyChanged{ 私有字符串\u标题; 公共字符串标题{ 获取{返回此。_title;} 设置{ 如果是这样的话。_title!=值{ 这个。_title=值; 此.OnPropertyChangedTitle; } } } 公众抽签{ 椭圆=新的椭圆; //[…]添加填充、笔划、宽度、高度属性并设置Canvas.Left和Canvas.Top。。。 myCanvas.Children.Addstone; } } 我想在生成GamesVM集合时执行Draw方法,但此时我无法访问相应的画布。将Draw方法放在代码中并没有任何帮助,因为我没有任何事件可以处理,在那里我可以同时获得数据绑定对象和新生成的画布,除非我错过了一些东西。。。。因此,我的Draw方法中没有myCanvas实例 我有一些想法去做那件事,但没有一件是好的 选择1 我可以将我的UIElement椭圆、直线等放在ObservableCollection中,该集合绑定在ItemsControl中,如下所示: 公众抽签{ myUIElements=新的可观察集合; 椭圆=新的椭圆; //[…]添加填充、笔划、宽度、高度属性并设置Canvas.Left和Canvas.Top。。。 梅伊元素。艾德斯通; } 它可以工作,但当我离开页面并返回时,我得到一个元素已经是另一个元素异常的子元素。 如果我使用VisualTreeHelper查找我的Items控件并调用Items.Clear,我也会得到一个异常,因为Items是只读的 选择2 我可以使用ContentControl而不是ItemsControl,并在我的Draw方法中创建画布: 公众抽签{ myUICanvas=新画布; 椭圆=新的椭圆; //[…]添加填充、笔划、宽度、高度属性并设置Canvas.Left和Canvas.Top。。。 myUICanvas.Children.Addstone; } 它也可以工作,但当我离开页面并返回时,我得到的值不在预期范围内。 我知道我无法绑定UIElement,因为当框架再次尝试设置它们时,我无法清除它们。有什么诀窍要说,请不要添加相同的元素两次 选择3 我可以尝试直接在XAML中绘制,并绑定ViewModel对象而不是UIElement对象 它可以在WPF中工作,但在我的Windows Phone 8应用程序中,我没有ItemContainerStyle属性来设置Canvas.Left和Canvas.Right。此外,我必须使用CompositeCollection来处理几种形状,但VisualStudio无法识别数据类型。 此外,即使它使用线元素,渲染也比c方法慢C# Windows Phone-如何在动态创建的画布中绘制形状-XAML与代码隐藏,c#,xaml,windows-phone-8,canvas,data-binding,C#,Xaml,Windows Phone 8,Canvas,Data Binding,我有一个longListSelector,它可以动态创建多个画布,我想使用ObservableCollection游戏中的数据在每个画布中绘制。 以下是主页的基本代码: 公共类GameVM:INotifyPropertyChanged{ 私有字符串\u标题; 公共字符串标题{ 获取{返回此。_title;} 设置{ 如果是这样的话。_title!=值{ 这个。_title=值; 此.OnPropertyChangedTitle; } } } 公众抽签{ 椭圆=新的椭圆; //[…]添加填充、笔划
那么,什么是最好的选择以及如何处理我的异常呢?关于信息,我给您介绍我选择的一种 我选择选项2,通过每次重新绘制一个新画布来避免返回错误。我更改了绘图定义,使其返回新画布
public class GameVM : INotifyPropertyChanged {
// Title and other properties
private Canvas _myUICanvas;
public Canvas myUICanvas
{
get {
_myUICanvas = Draw();
return _myUICanvas;
}
set {
// this is never called
_myUICanvas = value;
}
}
public Canvas Draw() {
Canvas newCanvas = new Canvas();
Ellispe stone = new Ellipse();
// [...] Add Fill, Strock, Width, Height properties and set Canvas.Left and Canvas.Top...
newCanvas.Children.Add(stone);
return newCanvas;
}
}
这样,我可以运行我的程序而不会出错,也不会重新加载/重新创建所有GameVM实例