C# Windows Phone-如何在动态创建的画布中绘制形状-XAML与代码隐藏

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; } } } 公众抽签{ 椭圆=新的椭圆; //[…]添加填充、笔划

我有一个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方法慢


那么,什么是最好的选择以及如何处理我的异常呢?

关于信息,我给您介绍我选择的一种

我选择选项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实例