wpf динамическое - Как программно задавать позиции строк и столбцов сетки




добавление элементов (3)

У меня есть две сетки внутри Stackpanel. Первая сетка называется GridX. Первоначально внутри сетки есть 2D-массив текстовых полей (RowDefs / ColumnDefs). Определение TextBox в XAML

<TextBox x:Name="A1" Grid.Row="4" Grid.Column="5" TextAlignment="Center" />

Я хочу добавить TextBlock программно в том же месте, что и в GridX.

Эффект должен быть таким

<TextBlock Grid.Row="4" Grid.Column="5"
    HorizontalAlignment="Left" VerticalAlignment="Top" Text="10" FontSize="8"/>

Как добавить это. Я пробовал это:

TextBlock tblock = new TextBlock();
GridX.SetColumn(tblock, cIndex);
GridX.SetRow(tblock, rIndex);

Но не удалось.

Опять я попробовал это:

int rIndex = Grid.GetRow(txtBox);
int cIndex = Grid.GetColumn(txtBox);                               

                            TextBlock tblock = new TextBlock();
                            tblock.VerticalAlignment = VerticalAlignment.Top;
                            tblock.HorizontalAlignment = HorizontalAlignment.Left;
                            tblock.FontSize = 8;
                            tblock.Text = rc[i, j - 1];

                            Grid.SetColumn(tblock, cIndex);
                            Grid.SetRow(tblock, rIndex);


                            txtBox.MaxLength = 1;    

Теперь проблема в том, что TextBlock не виден. TextBox скрывает его. Вы можете помочь


Answers

Вот пример, который может помочь кому-то:

Grid test = new Grid();
test.ColumnDefinitions.Add(new ColumnDefinition());
test.ColumnDefinitions.Add(new ColumnDefinition());
test.RowDefinitions.Add(new RowDefinition());
test.RowDefinitions.Add(new RowDefinition());
test.RowDefinitions.Add(new RowDefinition());

Label t1 = new Label();
t1.Content = "Test1";
Label t2 = new Label();
t2.Content = "Test2";
Label t3 = new Label();
t3.Content = "Test3";
Label t4 = new Label();
t4.Content = "Test4";
Label t5 = new Label();
t5.Content = "Test5";
Label t6 = new Label();
t6.Content = "Test6";

Grid.SetColumn(t1, 0);
Grid.SetRow(t1, 0);
test.Children.Add(t1);

Grid.SetColumn(t2, 1);
Grid.SetRow(t2, 0);
test.Children.Add(t2);

Grid.SetColumn(t3, 0);
Grid.SetRow(t3, 1);
test.Children.Add(t3);

Grid.SetColumn(t4, 1);
Grid.SetRow(t4, 1);
test.Children.Add(t4);

Grid.SetColumn(t5, 0);
Grid.SetRow(t5, 2);
test.Children.Add(t5);

Grid.SetColumn(t6, 1);
Grid.SetRow(t6, 2);
test.Children.Add(t6);

Для прикрепленных свойств вы можете вызвать SetValue для объекта, для которого вы хотите присвоить значение:

tblock.SetValue(Grid.RowProperty, 4);

Или вызовите статический метод Set (не как метод экземпляра, как вы пытались) для свойства в типе владельца, в этом случае SetRow:

Grid.SetRow(tblock, 4);

Как сказал wuminqi , Application.Current.Shutdown(); является необратимым, и я считаю, что он обычно используется для принудительного закрытия приложения, например, когда пользователь выходит из системы или выключает Windows.

Вместо этого вызовите this.close() в главном окне. Это то же самое, что и нажатие Alt + F4 или кнопка закрытия [x] в окне. Это приведет к закрытию всех остальных закрытых окон и вызовет Application.Current.Shutdown(); пока закрытое действие не было отменено. См. Документацию MSDN по закрытию окна .

Кроме того, поскольку this.close() можно отменить, вы можете поместить в диалог подтверждения изменений изменений в обработчик события закрытия. Просто создайте обработчик событий для <Window Closing="..."> и соответствующим образом измените e.Cancel . (Более подробную информацию о том, как это сделать, см. В документации MSDN .)





wpf gridview