Как получить номера в разных позициях - PullRequest
0 голосов
/ 09 октября 2018

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

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Это 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, воспользуйтесь им.

Отказ от ответственности: мне приходилось иметь дело с созданием элементов управления пользовательским интерфейсом на всех ОДИН РАЗ.За 7 лет профессиональной работы в WPF и только потому, что представляемая структура данных была невероятно сложной (и не похожей на то, как она была представлена).

0 голосов
/ 09 октября 2018

Как упомянуто ниже , ваш подход может быть немного изменен.В 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);

Вы, конечно, захотите изменить это, но я хотел дать вам идею для работы.Также то же самое нужно будет сделать для текста.Затем, каждый раз, когда вы щелкаете по нему, он создает их в зависимости от количества детей, которые у него уже есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...