none
Чего не так (цикл For)? RRS feed

  • Вопрос

  • Задача разместить в Grid три объекта в произвольном месте - в качестве объекта беру например TextBlock

                    for (int i = 0; i < 3; i++)
                    {
    
                        Random ran = new Random();
                        double _x = ran.Next(50, Convert.ToInt32(GRDF.ActualHeight));
                        double _y = ran.Next(50, Convert.ToInt32(GRDF.ActualWidth));
    
                        TextBlock tbl = new TextBlock();
                        tbl.Text = "Проверка";
                        tbl.Foreground = new SolidColorBrush(Colors.Black);
                        tbl.FontSize = 40;
                        tbl.VerticalAlignment = VerticalAlignment.Top;
                        tbl.HorizontalAlignment = HorizontalAlignment.Left;
                        tbl.Margin = new Thickness(_y, _x, 0, 0);
    
                        GRDF.Children.Add(tbl);
                    }
    Ну т.е. нужны три объекта в случайном размещении и ничего не вижу. Ничего не размещается.

    Спасибо

    12 марта 2013 г. 4:01

Ответы

  • Что значит редко? Вы куда добавляете эти TextBlock? Нужно же добавлять их в разные положения (Columns и Rows). А если у вас 1 колонка и 1 строка, так TextBlock'и могут просто перекрывать друг друга. Сделайте так:

    private void NewMethod()
            {
                GRDF.Children.Clear();
    
                for (int i = 0; i <= 13; i++)
                {
                    Random ran = new Random();
    
                    double _x = ran.Next(50, 500);
                    double _y = ran.Next(50, 1500);
    
                    TextBlock tbl = new TextBlock();
                    tbl.Text = "Проверка " + i.ToString();
                    //tbl.Foreground = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));
                    tbl.Foreground = new SolidColorBrush(Colors.Red);
                    tbl.FontSize = 40;
                    tbl.VerticalAlignment = VerticalAlignment.Top;
                    tbl.HorizontalAlignment = HorizontalAlignment.Left;
                    tbl.Margin = new Thickness(_y, _x, 0, 0);
                    Grid.SetColumn(tbl, 0);
                    Grid.SetRow(tbl, 0);
    
                    GRDF.Children.Add(tbl);
                }
            }

    • Помечено в качестве ответа developers_s 12 марта 2013 г. 7:32
    12 марта 2013 г. 6:58

Все ответы

  • Нужно для TextBlock установить Column и Row:

    TextBlock textBlock = new TextBlock();
    GRDF.SetColumn(textBlock , 1);
    GRDF.SetRow(textBlock , 1);
    GRDF.Children.Add(textBlock);

    12 марта 2013 г. 5:25
  • А в windows 8 это работает? У меня пишет ошибку.


    Спасибо


    12 марта 2013 г. 5:32
  • Какая ошибка?
    12 марта 2013 г. 5:56
  • Доступ к члену Grid.SetColumns... через ссылку на экземпляр невозможен. Вместо этого уточните его указав его имя


    Спасибо


    12 марта 2013 г. 6:12
  • Создал отдельный проект. Grid без Columns совсем. Добавляется и TextBlock отображается. Но почему очень редко два а так только по одному

            private void NewMethod()
            {
                GRDFon.Children.Clear();
    
                for (int i = 0; i <= 13; i++)
                {
                    Random ran = new Random();
    
                    double _x = ran.Next(50, 500);
                    double _y = ran.Next(50, 1500);
    
                    TextBlock tbl = new TextBlock();
                    tbl.Text = "Проверка";
                    //tbl.Foreground = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));
                    tbl.Foreground = new SolidColorBrush(Colors.Red);
                    tbl.FontSize = 40;
                    tbl.VerticalAlignment = VerticalAlignment.Top;
                    tbl.HorizontalAlignment = HorizontalAlignment.Left;
                    tbl.Margin = new Thickness(_y, _x, 0, 0);
    
                    GRDF.Children.Add(tbl);
                }
            }
    
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                NewMethod();
            }
        <Grid>
            
        
        <Grid Name="GRDF">
            
    
        </Grid>
            <Button Content="Button" HorizontalAlignment="Left" Margin="136,284,0,0" VerticalAlignment="Top" Click="Button_Click_1"/>
        </Grid>
    По ощущениям Grid.Children.Add надо делать уже ко всем созданным экземплярам, может по очереди не делается ?


    Спасибо


    12 марта 2013 г. 6:21
  •         private void NewMethod()
            {
                GRDF.Children.Clear();
    
                for (int i = 0; i <= 13; i++)
                {
                    Random ran = new Random();
    
                    double _x = ran.Next(50, 500);
                    double _y = ran.Next(50, 1500);
    
                    TextBlock tbl = new TextBlock();
                    tbl.Text = "Проверка";
                    //tbl.Foreground = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));
                    tbl.Foreground = new SolidColorBrush(Colors.Red);
                    tbl.FontSize = 40;
                    tbl.VerticalAlignment = VerticalAlignment.Top;
                    tbl.HorizontalAlignment = HorizontalAlignment.Left;
                    tbl.Margin = new Thickness(_y, _x, 0, 0);
                    Grid.SetColumn(tbl, 0);
                    Grid.SetRow(tbl, 0);
    
                    GRDF.Children.Add(tbl);
                }
            }
    

    12 марта 2013 г. 6:40
  • Это прокатило. Но всё равно создаётся один TextBlock. Редко 2.

    Спасибо

    12 марта 2013 г. 6:53
  • Что значит редко? Вы куда добавляете эти TextBlock? Нужно же добавлять их в разные положения (Columns и Rows). А если у вас 1 колонка и 1 строка, так TextBlock'и могут просто перекрывать друг друга. Сделайте так:

    private void NewMethod()
            {
                GRDF.Children.Clear();
    
                for (int i = 0; i <= 13; i++)
                {
                    Random ran = new Random();
    
                    double _x = ran.Next(50, 500);
                    double _y = ran.Next(50, 1500);
    
                    TextBlock tbl = new TextBlock();
                    tbl.Text = "Проверка " + i.ToString();
                    //tbl.Foreground = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));
                    tbl.Foreground = new SolidColorBrush(Colors.Red);
                    tbl.FontSize = 40;
                    tbl.VerticalAlignment = VerticalAlignment.Top;
                    tbl.HorizontalAlignment = HorizontalAlignment.Left;
                    tbl.Margin = new Thickness(_y, _x, 0, 0);
                    Grid.SetColumn(tbl, 0);
                    Grid.SetRow(tbl, 0);
    
                    GRDF.Children.Add(tbl);
                }
            }

    • Помечено в качестве ответа developers_s 12 марта 2013 г. 7:32
    12 марта 2013 г. 6:58
  • А если нет колонок и строк. То никак? Почему Random  создаёт всегда одни цифры? Раз они перекрывают друг друга. Или вместо Grid тогда нужен Canvas - а в Grid сделать не реально без колонок и строк?

    Спасибо

    12 марта 2013 г. 7:15
  • Если вы хотите добавлять колонки и строки динамически, то добавлять их нужно так:

    // Create Columns
        ColumnDefinition gridCol1 = new ColumnDefinition();
        GRDF.ColumnDefinitions.Add(gridCol1);
     
        // Create Rows
        RowDefinition gridRow1 = new RowDefinition();
        GRDF.RowDefinitions.Add(gridRow1);
    Посмотрите пример
    12 марта 2013 г. 7:28
  • Всё разобрался. Точнее помогли разобраться :)

    Надо вынести создание случайного числа за цикл.

            private void NewMethod()
            {
                GRDF.Children.Clear();
                Random ran = new Random();
                for (int i = 0; i <= 3; i++)
                {
    
                    double _x = 0;
                    double _y = 0;
                    _x = ran.Next(50, 500);
                    _y = ran.Next(50, 1500);
    
                    TextBlock tbl = new TextBlock();
                    tbl.Text = "Проверка " + i.ToString();
    
                    tbl.Foreground = new SolidColorBrush(Colors.Red);
                    tbl.FontSize = 40;
                    tbl.VerticalAlignment = VerticalAlignment.Top;
                    tbl.HorizontalAlignment = HorizontalAlignment.Left;
                    tbl.Margin = new Thickness(_y, _x, 0, 0);
    
    
                    GRDF.Children.Add(tbl);
                }
            }
    Вот так работает как надо

    Спасибо

    12 марта 2013 г. 7:31