Как получить числа в разных позициях

Я хочу получить только одно число и один кружок, когда я нажимаю кнопку, поэтому, если я нажму кнопку 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();

Помогает ли вызов caPaper.Children.Clear(); в начале btnGo_Click? Другая возможность - отключить кнопку при нажатии на btnGo.Enabled = false;, чтобы пользователь мог щелкнуть ее только один раз.

Olivier Jacot-Descombes 09.10.2018 18:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как указано ниже, ваш подход можно немного изменить. 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 показывает ошибку. "Длина" подчеркнута.

amur567 09.10.2018 18:49

Может быть, граф (). Я на своем телефоне.

Cory 09.10.2018 18:51

Он не показывает ошибки с Count (), но я до сих пор не знаю, как это сделать. Нужно ли мне просто менять на «marginLeft» в каждом эллипсе?

amur567 09.10.2018 18:57

У тебя сейчас будет только один. Каждый раз, когда вы нажимаете кнопку, она должна добавлять другую.

Cory 09.10.2018 19:00

О, я разобрался с кругами, но не с текстами на них.

amur567 09.10.2018 19:02

Это на 100% подход неправильный к этому.

Вы должны никогда динамически создавать такие элементы управления пользовательского интерфейса. Это так неправильно, что не стоит выяснять, что не так в вашем коде.

Используйте 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. То, что вы написали, для меня довольно сложно, но все равно спасибо.

amur567 09.10.2018 19:21

@MinJie Понятно, но это неправильный путь, вы научитесь так многим плохим привычкам. Либо найдите способ убедить своего инструктора делать все правильно, либо, по крайней мере, научитесь этому на стороне. Приступая к работе с MVVM, у вас закружится голова, но оно того стоит.

BradleyDotNET 09.10.2018 19:23

@MinJie "мы никогда ничего не меняли в XAML" => Гарантия того, что вы делаете это неправильно.

BradleyDotNET 09.10.2018 19:25

Возможно, ты прав. Я новичок в программировании, поэтому просто пытаюсь следить за тем, что делает учитель, но она почти ничего не объясняет. Цените помощь!

amur567 09.10.2018 19:28

@BradleyDotNET холодок ... вы видите, он явно новичок в программировании. Это может быть неправильным в широком смысле, но абсолютно нормально, когда он пытается изучить основы. Любой опытный разработчик согласится, что это не «лучший» подход, но это не значит, что нет смысла делать что-то неправильно, прежде чем изучать «лучшие» способы их решения.

Cory 09.10.2018 19:58

@Cory Есть чему поучиться на собственном опыте ... и просто делать что-то не так (он же goto). Если вы хотите изучить процедурный код пользовательского интерфейса, хорошо; но если вы хотите изучить WPF (или, чтобы быть более понятным, большинство современных фреймворков пользовательского интерфейса), сразу получить кучу вредных привычек - это не лучший подход, ИМО. Также см. Мой отказ от ответственности ... хотя вы, безусловно, можете изучить принципы программирования, поступая таким образом, в действительности вы на самом деле не делаете этого в промышленности.

BradleyDotNET 09.10.2018 20:03

@Cory Кроме того; Разве вы не лучше научитесь некоторым хорошим основам ООП, чем процедурно работать с пользовательским интерфейсом;)

BradleyDotNET 09.10.2018 20:09

@BradleyDotNET Я согласен. 100%. Я исхожу из того, что я также «понимаю», почему нужно что-то делать определенным образом. ИМО, для молодых разработчиков важно сосредоточиться на том, чтобы что-то работало, а затем переходить к тому, чтобы делать что-то более подходящее для ситуации. Тем не менее, я должен был начать свой ответ со слов «это неправильно, но вот как заставить ваш код работать».

Cory 09.10.2018 20:10

@BradleyDotNET, лол, я бы предпочел никогда не трогать пользовательский интерфейс в другой раз в своей жизни. Но это мое предпочтение.

Cory 09.10.2018 20:11

@Cory Я на 100% согласен, в свою очередь, чтобы что-то работало первым ... Просто, если это действительно то, откуда приходит разработчик (этот MVVM просто слишком много), я бы лично сказал, что они должны получить этот опыт в консольных приложениях вместо этого войти в образ мышления «WinForms», который легко может преследовать их позже. Конечно, ни разу не постучал по OP; скорее инструктор.

BradleyDotNET 09.10.2018 20:12

@BradleyDotNET, конечно. Если только следующий урок не будет мы сделали это неправильно, теперь давайте покажем вам правильный путь, тогда преподавателю нечего делать с ними в WPF. Я не думаю, что презентация когда-либо должна быть частью урока программирования, но это я. Если класс не ориентирован на уровень представления (мобильный дизайн / веб-дизайн и т. д.), Вы должны застрять в консоли. Опять же мое мнение.

Cory 09.10.2018 20:19

@BradleyDotNET спасибо за то, что туда и обратно. Я обновил свой пост, добавив в него отказ от ответственности «не делайте этого таким образом», поскольку я считаю, что это важно. Отличный улов и способ сохранить честность разработчиков!

Cory 09.10.2018 20:20

Я поддержу все, что сказал Брэдли. После многих лет разработки WinForms и работы над C++ / MFC до этого я уже около 18 месяцев использую WPF на постоянной основе. И я могу вам сказать, что временами это был болезненный переход. Однако чем больше я узнаю, тем больше я начинаю ценить, насколько хорошо все это работает, и насколько легко вы можете добраться туда, куда идете, без всей тяжелой работы, которая могла бы быть при работе с формами. В том числе такие примеры, как OP, вынуждены терпеть.

DonBoitnott 09.10.2018 20:31

Другие вопросы по теме