以异步方式以编程方式将UIElement添加到视图中

本文关键字:方式 视图 添加 异步 编程 UIElement | 更新日期: 2023-09-27 18:22:45

我实际上正在尝试以异步方式将一些UIElement添加到我的MainPage中的Canvas定义中。

据我所知,将UIElement添加到Canvas的基本方法是将其添加到他的UIElementCollection中,例如,使用我应该这样做的行:

        Line line = new Line();
        // Line attributes
        line.Stroke = new SolidColorBrush(Colors.Purple);
        line.StrokeThickness = 15;
        Point point1 = new Point();
        point1.X = 0;
        point1.Y = 0;
        Point point2 = new Point();
        point2.X = 480;
        point2.Y = 720;
        line.X1 = point1.X;
        line.Y1 = point1.Y;
        line.X2 = point2.X;
        line.Y2 = point2.Y;
        // Line attributes
        MyCanvas.Children.Add(line);

让我们想象一下,我有一个类调用Graphics,它需要访问这个画布才能在上面绘制。

 public class Graphics
 {
     public void drawLine()
     {
            //Using Dispatcher in order to access the main UI thread
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
               Line line = new Line();
               // Line attributes
               /**
                *  Here I want to access the Canvas of the MainPage
                *  I have no Idea what to put here !!!
                *
                **/
            });
      }
  }

在"我不知道在这里放什么!!"的位置,我试图直接访问主页画布-->失败

我试图在MainPage中声明一个公共静态UIElementCollection,以便添加我的UIElement,然后将其传递到Canvas,但这是不可能的,因为UIElementCollection没有构造函数-->FAIL

但这些想法似乎是肮脏的编码,并不是真正优雅的。因此,通过我的研究,我发现MVVM应该发挥魔力。但我发现的所有教程都是通过xaml文件进行数据招标,这在我的情况下无法使用。

所以我有两个问题:

第一:如何使用画布的UIElementCollection?(有没有一个隐藏的方法叫"谁绘制",比如JAVA中的"绘制"或"重新绘制"?)

第二:如果我想遵循MVVM模式,我是否可以将MainPage作为我的视图,将Graphics类作为我的ViewModel,将UIElement视为我的模型?

以异步方式以编程方式将UIElement添加到视图中

这是一个非常基本的例子,但应该会让您朝着正确的方向前进。

图形.cs

 public class Graphics
{
    public ObservableCollection<UIElement> UIElements { get; set; }
    int poisiton = 0;
    private Timer backgroundTimer;
    public Graphics()
    {
        this.UIElements = new ObservableCollection<UIElement>();
        this.backgroundTimer = new Timer(new TimerCallback((timer) => {
            Deployment.Current.Dispatcher.BeginInvoke(() => this.GenerateLine());
        }), null, 2000, 3000);
    }
    private void GenerateLine()
    {
        Line line = new Line();
        // Line attributes
        line.Stroke = new SolidColorBrush(Colors.Purple);
        line.StrokeThickness = 15;
        Point point1 = new Point();
        point1.X = this.poisiton;
        point1.Y = this.poisiton;
        Point point2 = new Point();
        point2.X = this.poisiton;
        point2.Y = this.poisiton + 30;
        line.X1 = point1.X;
        line.Y1 = point1.Y;
        line.X2 = point2.X;
        line.Y2 = point2.Y;
        // Line attributes
        this.poisiton += 10;
        UIElements.Add(line);
    }
}

主页.xaml.cs

 public MainPage()
 {
      InitializeComponent();
      this.Loaded += MainPage_Loaded;
      // Sample code to localize the ApplicationBar
      //BuildLocalizedApplicationBar();
 }
  void MainPage_Loaded(object sender, RoutedEventArgs e)
  {
      var graphics = new Graphics();
      this.ContentPanel.DataContext = graphics;
  }

主页.xaml

  <Canvas x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
      <ItemsControl ItemsSource="{Binding UIElements}">
      </ItemsControl>
  </Canvas>

我希望这能有所帮助。