Я хочу получить только одно число и один кружок, когда я нажимаю кнопку, поэтому, если я нажму кнопку 3 раза, я, очевидно, получу 3 числа с кружками. Предполагается, что номера лотереи появляются после каждого щелчка, но я понятия не имею, как я могу это сделать.
private void btnGo_Click(object sender, RoutedEventArgs e)
{
Ellipse first = new Ellipse();
first.Fill = new SolidColorBrush(Colors.Red);
first.Height = 70;
first.Width = 70;
first.Margin = new Thickness(50, 100, 0, 0);
caPaper.Children.Add(first);
Ellipse second = new Ellipse();
second.Fill = new SolidColorBrush(Colors.Red);
second.Height = 70;
second.Width = 70;
second.Margin = new Thickness(150, 100, 0, 0);
caPaper.Children.Add(second);
Ellipse third = new Ellipse();
third.Fill = new SolidColorBrush(Colors.Red);
third.Height = 70;
third.Width = 70;
third.Margin = new Thickness(250, 100, 0, 0);
caPaper.Children.Add(third);
Random rd = new Random();
TextBlock txt1 = new TextBlock();
txt1.FontSize = 20;
txt1.Foreground = Brushes.White;
txt1.Text = " " + rd.Next(1, 45);
Canvas.SetTop(txt1, 120);
Canvas.SetLeft(txt1, 70);
caPaper.Children.Add(txt1);
TextBlock txt2 = new TextBlock();
txt2.FontSize = 20;
txt2.Foreground = Brushes.White;
txt2.Text = " " + rd.Next(1, 45);
Canvas.SetTop(txt2, 120);
Canvas.SetLeft(txt2, 170);
caPaper.Children.Add(txt2);
TextBlock txt3 = new TextBlock();
txt3.FontSize = 20;
txt3.Foreground = Brushes.White;
txt3.Text = " " + rd.Next(1, 45);
Canvas.SetTop(txt3, 120);
Canvas.SetLeft(txt3, 270);
caPaper.Children.Add(txt3);
}
private void btnClear_Click(object sender, RoutedEventArgs e)
{
caPaper.Children.Clear();





Как указано ниже, ваш подход можно немного изменить. WPF имеет несколько действительно мощных функций привязки данных, позволяющих безболезненно создавать пользовательский интерфейс. Однако, чтобы ответить на ваш вопрос ...
Похоже, что единственное, что является «уникальным» для каждого шара, - это маржа мяча и левое значение в Canvas.SetLeft.
Вы должны иметь возможность получать эти значения на основе количества дочерних элементов на вашем холсте. Например что-то вроде этого:
int marginLeft = 50 + (caPaper.Children.Length * 100);
Ellipse newBall = new Ellipse();
newBall.Fill = new SolidColorBrush(Colors.Red);
newBall.Height = 70;
newBall.Width = 70;
newBall.Margin = new Thickness(marginLeft, 100, 0, 0);
caPaper.Children.Add(newBall);
Вы, конечно, захотите отрегулировать это, но я хотел дать вам идею для работы. То же самое нужно будет проделать и с текстом. Затем, каждый раз, когда вы щелкаете по нему, он будет создавать их в зависимости от количества дочерних элементов, которые у него уже есть.
caPaper.Children.Length показывает ошибку. "Длина" подчеркнута.
Может быть, граф (). Я на своем телефоне.
Он не показывает ошибки с Count (), но я до сих пор не знаю, как это сделать. Нужно ли мне просто менять на «marginLeft» в каждом эллипсе?
У тебя сейчас будет только один. Каждый раз, когда вы нажимаете кнопку, она должна добавлять другую.
О, я разобрался с кругами, но не с текстами на них.
Вы должны никогда динамически создавать такие элементы управления пользовательского интерфейса. Это так неправильно, что не стоит выяснять, что не так в вашем коде.
Используйте MVVM, это сделает вашу жизнь намного, намного, намного проще. Ваши лотерейные номера - это данные, шары, визуальное представление этих данных. Итак, в вашей виртуальной машине:
public ObservableCollection<int> Draws {get;} = new ObservableCollection<int>();
// Invoked from command, or could be a click handler until you learn commands
public AddDraw()
{
int draw = GetNextDraw(); //Left as an exercise
Draws.Add(draw)
}
Теперь, когда данные обработаны, нам нужно их отобразить. ItemsControl - это то, как вы отображаете коллекции, используйте ItemTemplate для управления отображением числа (шарик) и ItemsPanel для управления макетом (горизонтальный WrapPanel, вероятно, то, что вам нужно):
<ItemsControl ItemsSource = "{Binding Draws}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Ellipse Fill = "Red/>
<TextBlock Text = "{Binding Path=.}" VerticalAlignment = "Center" HorizontalAlignment = "Center"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemPanelTemplate>
<WrapPanel Orientation = "Horizontal"/>
</ItemPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Это не в моей голове, поэтому у меня может быть неправильное свойство или класс. Однако Intellisense должен исправить это довольно быстро.
После его настройки вы можете добавить маржу, изменить цвета, что угодно. Этот дизайн - то, для чего был создан WPF, воспользуйтесь его преимуществами.
Disclaimer: I have had to deal with creating UI controls at all ONCE. In 7 years of professional WPF work, and only because the data structure being represented was incredibly complex (and not similar to how it was being represented).
Дело в том, что я только начал использовать C#. У меня было всего 3 курса, и учитель особо не учит, но мы никогда ничего не меняли в XAML. То, что вы написали, для меня довольно сложно, но все равно спасибо.
@MinJie Понятно, но это неправильный путь, вы научитесь так многим плохим привычкам. Либо найдите способ убедить своего инструктора делать все правильно, либо, по крайней мере, научитесь этому на стороне. Приступая к работе с MVVM, у вас закружится голова, но оно того стоит.
@MinJie "мы никогда ничего не меняли в XAML" => Гарантия того, что вы делаете это неправильно.
Возможно, ты прав. Я новичок в программировании, поэтому просто пытаюсь следить за тем, что делает учитель, но она почти ничего не объясняет. Цените помощь!
@BradleyDotNET холодок ... вы видите, он явно новичок в программировании. Это может быть неправильным в широком смысле, но абсолютно нормально, когда он пытается изучить основы. Любой опытный разработчик согласится, что это не «лучший» подход, но это не значит, что нет смысла делать что-то неправильно, прежде чем изучать «лучшие» способы их решения.
@Cory Есть чему поучиться на собственном опыте ... и просто делать что-то не так (он же goto). Если вы хотите изучить процедурный код пользовательского интерфейса, хорошо; но если вы хотите изучить WPF (или, чтобы быть более понятным, большинство современных фреймворков пользовательского интерфейса), сразу получить кучу вредных привычек - это не лучший подход, ИМО. Также см. Мой отказ от ответственности ... хотя вы, безусловно, можете изучить принципы программирования, поступая таким образом, в действительности вы на самом деле не делаете этого в промышленности.
@Cory Кроме того; Разве вы не лучше научитесь некоторым хорошим основам ООП, чем процедурно работать с пользовательским интерфейсом;)
@BradleyDotNET Я согласен. 100%. Я исхожу из того, что я также «понимаю», почему нужно что-то делать определенным образом. ИМО, для молодых разработчиков важно сосредоточиться на том, чтобы что-то работало, а затем переходить к тому, чтобы делать что-то более подходящее для ситуации. Тем не менее, я должен был начать свой ответ со слов «это неправильно, но вот как заставить ваш код работать».
@BradleyDotNET, лол, я бы предпочел никогда не трогать пользовательский интерфейс в другой раз в своей жизни. Но это мое предпочтение.
@Cory Я на 100% согласен, в свою очередь, чтобы что-то работало первым ... Просто, если это действительно то, откуда приходит разработчик (этот MVVM просто слишком много), я бы лично сказал, что они должны получить этот опыт в консольных приложениях вместо этого войти в образ мышления «WinForms», который легко может преследовать их позже. Конечно, ни разу не постучал по OP; скорее инструктор.
@BradleyDotNET, конечно. Если только следующий урок не будет мы сделали это неправильно, теперь давайте покажем вам правильный путь, тогда преподавателю нечего делать с ними в WPF. Я не думаю, что презентация когда-либо должна быть частью урока программирования, но это я. Если класс не ориентирован на уровень представления (мобильный дизайн / веб-дизайн и т. д.), Вы должны застрять в консоли. Опять же мое мнение.
@BradleyDotNET спасибо за то, что туда и обратно. Я обновил свой пост, добавив в него отказ от ответственности «не делайте этого таким образом», поскольку я считаю, что это важно. Отличный улов и способ сохранить честность разработчиков!
Я поддержу все, что сказал Брэдли. После многих лет разработки WinForms и работы над C++ / MFC до этого я уже около 18 месяцев использую WPF на постоянной основе. И я могу вам сказать, что временами это был болезненный переход. Однако чем больше я узнаю, тем больше я начинаю ценить, насколько хорошо все это работает, и насколько легко вы можете добраться туда, куда идете, без всей тяжелой работы, которая могла бы быть при работе с формами. В том числе такие примеры, как OP, вынуждены терпеть.
Помогает ли вызов
caPaper.Children.Clear();в началеbtnGo_Click? Другая возможность - отключить кнопку при нажатии наbtnGo.Enabled = false;, чтобы пользователь мог щелкнуть ее только один раз.