문제
저는 XAML에 대해 알아보고 코드를 작성해 볼까 생각했습니다.
6 x 6 열 정의가 있는 그리드를 추가하려고 시도한 다음 그리드 셀 중 하나에 텍스트 블록을 추가합니다.원하는 셀을 참조할 수 없는 것 같습니다.그리드에는 텍스트 블록도 추가할 수 있는 방법이 없습니다.Grid.children.add(object)만 있고 Cell 정의는 없습니다.
XAML:
<Page x:Class="WPF_Tester.Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Page1"
Loaded="Page_Loaded">
</Page>
씨#:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
//create the structure
Grid g = new Grid();
g.ShowGridLines = true;
g.Visibility = Visibility.Visible;
//add columns
for (int i = 0; i < 6; ++i)
{
ColumnDefinition cd = new ColumnDefinition();
cd.Name = "Column" + i.ToString();
g.ColumnDefinitions.Add(cd);
}
//add rows
for (int i = 0; i < 6; ++i)
{
RowDefinition rd = new RowDefinition();
rd.Name = "Row" + i.ToString();
g.RowDefinitions.Add(rd);
}
TextBlock tb = new TextBlock();
tb.Text = "Hello World";
g.Children.Add(tb);
}
업데이트
으스스한 부분은 다음과 같습니다.
XP에서 VS2008 Pro 사용하기
WPFbrowser 프로젝트 템플릿(3.5 검증됨)
자동 완성에서 메소드를 얻지 못했습니다.
해결책
WPF는 다음과 같은 펑키한 기능을 사용합니다. 연결된 속성.따라서 XAML에서는 다음과 같이 작성할 수 있습니다.
<TextBlock Grid.Row="0" Grid.Column="0" />
그러면 TextBlock이 그리드의 셀(0,0)로 효과적으로 이동됩니다.
코드에서는 조금 이상해 보입니다.나는 그것이 다음과 같을 것이라고 믿는다:
g.Children.Add(tb);
Grid.SetRow(tb, 0);
Grid.SetColumn(tb, 0);
위의 링크를 살펴보십시오. 연결된 속성을 사용하면 직관적으로 보이는 코드를 희생하더라도 XAML에서 작업을 정말 쉽게 수행할 수 있습니다.
다른 팁
셀 위치는 연결된 속성입니다. 값은 Grid가 아닌 TextBlock에 속합니다.하지만 속성 자체가 Grid에 속하므로 속성 정의 필드나 제공되는 정적 함수를 사용해야 합니다.
TextBlock tb = new TextBlock();
//
// Locate tb in the second row, third column.
// Row and column indices are zero-indexed, so this
// equates to row 1, column 2.
//
Grid.SetRow(tb, 1);
Grid.SetColumn(tb, 2);
Grid 클래스의 연결된 속성을 사용합니다.
C#에서:
Grid.SetRow( cell, rownumber )
XAML에서:
<TextBlock Grid.Row="1" />
또한 동적 그리드를 사용하지 않는 경우 XAML 마크업 언어를 사용하는 것이 좋습니다.알아요, 학습 곡선이 있지만, 일단 익히고 나면 훨씬 쉬워집니다. 특히 ControlTemplates 및 DataTemplate을 사용하려는 경우 더욱 그렇습니다!;)
여기 몇 가지 샘플이 있습니다.
Grid grid = new Grid();
// Set the column and row definitions
grid.ColumnDefinitions.Add(new ColumnDefinition() {
Width = new GridLength(1, GridUnitType.Auto) });
grid.ColumnDefinitions.Add(new ColumnDefinition() {
Width = new GridLength(1, GridUnitType.Star) });
grid.RowDefinitions.Add(new RowDefinition() {
Height = new GridLength(1, GridUnitType.Auto) });
grid.RowDefinitions.Add(new RowDefinition() {
Height = new GridLength(1, GridUnitType.Auto) });
// Row 0
TextBlock tbFirstNameLabel = new TextBlock() { Text = "First Name: "};
TextBlock tbFirstName = new TextBlock() { Text = "John"};
grid.Children.Add(tbFirstNameLabel ); // Add to the grid
Grid.SetRow(tbFirstNameLabel , 0); // Specify row for previous grid addition
Grid.SetColumn(tbFirstNameLabel , 0); // Specity column for previous grid addition
grid.Children.Add(tbFirstName ); // Add to the grid
Grid.SetRow(tbFirstName , 0); // Specify row for previous grid addition
Grid.SetColumn(tbFirstName , 1); // Specity column for previous grid addition
// Row 1
TextBlock tbLastNameLabel = new TextBlock() { Text = "Last Name: "};
TextBlock tbLastName = new TextBlock() { Text = "Smith"};
grid.Children.Add(tbLastNameLabel ); // Add to the grid
Grid.SetRow(tbLastNameLabel , 1); // Specify row for previous grid addition
Grid.SetColumn(tbLastNameLabel , 0); // Specity column for previous grid addition
grid.Children.Add(tbLastName ); // Add to the grid
Grid.SetRow(tbLastName , 1); // Specify row for previous grid addition
Grid.SetColumn(tbLastName , 1); // Specity column for previous grid addition