C # WPF. Как динамически добавлять эллипсы в холст?

1

Я пытаюсь добавить некоторые эллипсы со случайными позициями в мой холст, но я могу видеть их на моем холсте. Progmab очень хорошо компилирует. Код:

for (int i = 0; i < FirefliesCount; ++i)
            {
                Firefly CurrentFirefly = new Firefly();
                CurrentFirefly.Speed = Randomer.Next(1, 3);
                CurrentFirefly.Body = new Ellipse();
                CurrentFirefly.Body.Margin = new Thickness(Randomer.Next(10, (int)MainCanvas.Width - 10),
                                                           Randomer.Next(10, (int)MainCanvas.Height - 10),
                                                           0, 0);
                CurrentFirefly.Body.Fill = Brushes.Black;
                CurrentFirefly.Body.Height = MainCanvas.Height / 4;
                CurrentFirefly.Body.Width = 1.5 * CurrentFirefly.Body.Height;
                MainCanvas.Children.Add(CurrentFirefly.Body);
            }

И класс Fireflie:

class Firefly
{
    public Ellipse Body { get; set; }
    public int Speed { get; set; }
}
Теги:
wpf
canvas

1 ответ

1

Возможно, вы не задали свойства Width и Height вашего MainCanvas; то они имеют значение NaN и поэтому вы не увидите эллипсов. Мое предложение - использовать ActualWidth и ActualHeight вместо этого и отложить добавление эллипсов до загрузки холста. Вот пример:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        MainCanvas.Loaded += MainCanvas_Loaded;
    }

    void MainCanvas_Loaded(object sender, RoutedEventArgs e)
    {
        Init();
    }

    private void Init()
    {
        const int FirefliesCount = 100;
        Random Randomer = new Random();

        for (int i = 0; i < FirefliesCount; ++i)
        {
            Firefly CurrentFirefly = new Firefly();
            CurrentFirefly.Speed = Randomer.Next(1, 3);
            CurrentFirefly.Body = new Ellipse();
            CurrentFirefly.Body.Margin = new Thickness(Randomer.Next(10, (int)MainCanvas.ActualWidth - 10),
                                                       Randomer.Next(10, (int)MainCanvas.ActualHeight - 10),
                                                       0, 0);
            CurrentFirefly.Body.Fill = Brushes.Black;
            CurrentFirefly.Body.Height = MainCanvas.ActualHeight / 4;
            CurrentFirefly.Body.Width = 1.5 * CurrentFirefly.Body.Height;
            MainCanvas.Children.Add(CurrentFirefly.Body);
        }
    }
}

Соответствующий файл xaml выглядит следующим образом:

<Window x:Class="WpfApplication7.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Canvas x:Name="MainCanvas"/>
</Window>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню