8

私は XAML について理解を深めようとしていて、コードを書いてみようと思いました。

6 x 6 の列定義を持つグリッドを追加しようとしてから、グリッド セルの 1 つにテキスト ブロックを追加します。必要なセルを参照できないようです。テキストブロックも追加できるグリッド上のメソッドはありません。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>

C#:

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 検証済み)

オートコンプリートでメソッドを取得できません。

4

4 に答える 4

7

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 での操作が非常に簡単になりますが、コードが直観的に見えるという欠点があります。

于 2008-08-11T07:37:24.713 に答える
0

セルの位置は添付プロパティです。値は 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);
于 2008-08-11T07:39:44.490 に答える
0

Grid クラスの添付プロパティを使用します。

C# で:

Grid.SetRow( cell, rownumber )

XAML の場合:

<TextBlock Grid.Row="1" />

また、ダイナミック グリッドを使用しない場合は、XAML マークアップ言語を使用することをお勧めします。学習曲線があることはわかっていますが、一度マスターすると、特に ControlTemplates と DataTemplates を使用する場合は、はるかに簡単になります! ;)

于 2008-08-11T07:39:52.757 に答える
0

ここにいくつかのサンプルがあります

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
于 2011-12-01T18:18:54.957 に答える