【问题标题】:Random Ellipse Generating Program随机椭圆生成程序
【发布时间】:2017-04-30 18:35:08
【问题描述】:

我制作了这个简单的程序,因为我想了解 WPF 的基础知识但它不起作用。

在 XAML 中,我只有名为 MainGrid 的网格和 button1 的按钮,其动作为 button1_Click,如下所示:

void button1_Click(object sender, RoutedEventArgs e)
    {
        Random rnd = new Random();
        System.Windows.Shapes.Ellipse ellipse = new Ellipse();
        ellipse.Fill = new SolidColorBrush(Colors.Red);
        ellipse.Margin = new Thickness(rnd.Next(0,(int)System.Windows.SystemParameters.PrimaryScreenWidth-100),rnd.Next(1,(int)System.Windows.SystemParameters.PrimaryScreenHeight-101),0,0);
        ellipse.Width = 100;
        ellipse.Height = 100;
        ellipse.Name = "ellipseTest";
        if (ellipseShown) {
            MainGrid.Children.Remove((UIElement)MainGrid.FindName("ellipseTest"));
        }
            MainGrid.Children.Add(ellipse);
    }

但是当我单击按钮时,前一个椭圆不会消失,有时当我单击按钮时它什么也不做(不要创建新的椭圆,不要消失)。请帮忙,谢谢。

【问题讨论】:

  • 如果它没有创建一个新的椭圆,那你怎么能说没有消失呢?除此之外,您是否真的设置了ellipseShown 字段?上面的代码中没有任何内容。无论如何,您都做错了:您应该创建一个表示椭圆的视图模型数据结构,然后在 XAML 中按数据模板呈现该模型。如果您一次只想要一个椭圆,那么只需一个带有 X 和 Y 的模型。如果您想要多个,请使用 ItemsControl。在任何一种情况下,使用Canvas,而不是Grid,和Canvas.Left/Canvas.Top,而不是Margin来定位对象。
  • 如此处所述,您的问题过于广泛。您没有包含一个好的minimal reproducible example,而且您的代码与好的 WPF 代码相差太远。基于上述内容的答案基本上是为您从头开始编写程序。以下是我过去回答的问题的一些链接,这些问题与您正在尝试做的事情非常相似:stackoverflow.com/a/28338925stackoverflow.com/a/33749132。也许您可以将这些作为在您的问题上取得进展的基础。

标签: c# wpf


【解决方案1】:

当您在运行时向可视化树添加/删除对象时,您需要使用 RegisterName 和 UnregisterName 来管理 XAML 命名空间。

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Random rnd = new Random();
        System.Windows.Shapes.Ellipse ellipse = new Ellipse();
        ellipse.Fill = new SolidColorBrush(Colors.Red);
        ellipse.Margin = new Thickness(rnd.Next(0, (int)System.Windows.SystemParameters.PrimaryScreenWidth - 100), rnd.Next(1, (int)System.Windows.SystemParameters.PrimaryScreenHeight - 101), 0, 0);
        ellipse.Width = 100;
        ellipse.Height = 100;
        ellipse.Name = "ellipseTest";
        if (ellipseShown)
        {
            System.Windows.Shapes.Ellipse ellipse0 = MainGrid.FindName("ellipseTest") as System.Windows.Shapes.Ellipse;
            MainGrid.Children.Remove(ellipse0);
            MainGrid.UnregisterName("ellipseTest");

        }
        MainGrid.RegisterName("ellipseTest", ellipse);
        MainGrid.Children.Add(ellipse);
        ellipseShown = true;
    }

见这篇文章:https://msdn.microsoft.com/en-us/library/ms746659(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    相关资源
    最近更新 更多