문제

저는 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top