【问题标题】:WPF Canvas Create objectWPF画布创建对象
【发布时间】:2012-11-02 20:32:49
【问题描述】:

我正在使用 WPF 和 C#,并且我有一个带有矩形的画布(就像一个迷宫)。现在我想创建一个在这个迷宫中移动(在算法的帮助下)的角色。因此,我创建了一个名为 character 的新类,但我的问题从这里开始:如何在画布上创建一个对象,该对象具有图像、位置以及可以访问角色类中的方法和属性? 所以最后的东西应该是这样的:

private class MainWindow
{

   //Here the canvas is made visible and the rectangles are being drawn on the canvas

   //Then a method should start to create the character and move him through the maze

   //it should look like (character.move(1) so the character moves one step forward etc.)

}

private class Character
{
//here are the methods and attributes the character should have
}

提前感谢我的英语不好:)

【问题讨论】:

    标签: c# wpf object canvas


    【解决方案1】:

    如果你从相反的方向看问题,解决起来会容易得多。

    创建您的角色对象,将其连接起来,以便一切都按照您在数据(模型)中的预期工作。然后,您需要添加表示角色位置的属性,例如

    public int XCoordinate { get; set; }
    public int YCoordinate { get; set; }
    

    确保移动完成模型端。如果您尝试根据视觉显示来驱动运动,这会使程序过于复杂。

    接下来,在画布中定义角色的视图,如下所示:

    <Canvas ...>
        <Image Canvas.Left="{Binding XCoordinate}" Canvas.Top="{Binding YCoordinate}" .../>
    </Canvas>
    

    最后,确保您的绑定语法正确(您是否设置了 DataContext?)并确保设置 NotifyPropertyChanged 以适应口味(这两者在其他地方都有很好的介绍)。然后,您将设置一个整齐划分的模型和视图,并且应该更容易专注于运动逻辑或您想要的任何其他内容。

    【讨论】:

      【解决方案2】:

      第一步是定义Character 类的属性和方法。这将包括(正如您在问题中指出的那样)Move(Position newPosition) 方法。 Position 可以是 Pointstructure 的包装器。 Character 类还需要包含对存在角色的 Canvas 的引用。这是必需的,因为当您调用 'character.Move(position)` 时,可以在角色当前关联的画布中移动角色。

      此外,MainWindow 可以包含对字符或字符集合的引用(以防您需要多个字符)。实际创建可以在MainWindow 的初始化过程中,也可以是lazy。初始化后,您的算法可以在字符实例上运行。

      【讨论】:

      • 好的,我用方法创建了字符类,但我还有另一个问题:如何通过这个字符类访问画布? Canvas 仅在 MainWindow 类中已知,我找不到可以更改它的位置,以便它在字符类中也是已知的。
      • @dingoglotz,您要更改哪个属性?
      • @dingoglotz,2 个语句中的哪一个不起作用(Canvas.SetLeft()charImage.Visibility 赋值)?
      • @dingoglotz,您在创建charImage 实例时是否将当前窗口/画布作为参数传递?您可以通过在语句后提供breakpoint 来验证调用后属性是否正在更改。
      • @dingoglotz,我建议您尝试@ianschol 发布的解决方案。它涉及在 Character 类中创建属性,这些属性公开其图像的 (x,y) 坐标。然后将这些属性绑定到 Canvas 中charImage 的相应属性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多