1

私はXAML全体にまったく慣れていません。

行と列の数が一定(例:2x5)のテーブル(グリッド)を作成しTextBlock、各セルにを配置する必要があります。

どうすればこれを適切に行うことができるので、セルのデータを簡単に変更できますか?

たとえば、1つの整数をオフセットとして受け入れる関数を作成したいとします。

void fillDate(int offset)

オフセットから始めてセルを段階的に塗りつぶします。

つまり、2x5に対して `fillData(3)'を使用して関数を呼び出すと、次のテーブルが生成されます。

 | | |1|2
3|4|5|6|7 
4

2 に答える 2

2

これを見てみてください。ここでは、アイテム配列のコンテナとしてListBoxを使用し、プレースホルダーとしてUniformGridを使用します(行と列の数をクラスのプロパティにバインドして、実行時に変更できます)

<Window x:Class=MyWindowClass ... >
    ... 
<ListBox 
 ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=MyWindowClass}, Path=myItems}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="{Binding Path=ColumnsInArray}"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=MyField}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

</Window>

コードでは、コレクションの要素を変更するだけです。

class MyWindowClass: INotifyPropertyChanged
{
    public MyWindowClass():base()
    {
         ...
         InitializeComponent();
         myItems = new ObservableCollection<MyObject>();
         myItems.Add(new MyObject);// First Element
         myItems.Add(new MyObject);// Second Element
         ...
         myItems.Add(new MyObject);// Last Element
         ...
    }

    int columns=5;
    public int ColumnsInArray
    {
        get{return columns;} 
        set {columns=value; NotifyPropertyChanged("ColumnsInArray");}
    }

    public ObservableCollection<MyObject> myItems
    {
        get{ ... }
        set{ ... }
    }

setItem

    void setItem(int index,MyObject newObject)
    {
        ...
        myItems[index]=newObject;
        ...
    }

    void setItem(int x, int y, MyObject newObject)
    {
        ...
        int index = y*columns+x;
        setItem(index,newObject);
        ...
    }

INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;
    void NotifyPropertyChanged( string prop )
    {
        if( PropertyChanged != null ) 
        PropertyChanged( this , new PropertyChangedEventArgs( prop ) );
    }

}

public class MyObject
{
    public string MyField{get;set;}
}
于 2012-09-05T17:56:06.050 に答える
0

これは特別なことではなく、Silverlight / XAMLのバックグラウンドから来ていますが、多かれ少なかれ機能します。APIのわずかな違い(VSを使用せずにメモ帳で書く)とテストされていないものを微調整する必要があるかもしれませんが、始めるために必要なものを提供する必要があります。

private void fillDate(int offset)
{
    int rows = 2;
    int columns = 5;
    int currentEntry = 1;

    for(int rowIndex = 0; rowIndex < rows; rowIndex++)
    {
        for (int columnIndex = 0; columnIndex < columns; columnIndex++)
        {
            if (currentEntry > offset)
            {
                TextBlock textEntry = new TextBlock();
                textEntry.Text = currentEntry.ToString();
                Grid.SetRow(textEntry, rowIndex);
                Grid.SetColumn(textEntry, columnIndex);
            }
            currentEntry++;
        }
    }
}

編集:「空の」セルにテキストがないTextBlockが必要な場合があることに気づきました。その場合、内部ループのコードを次のように置き換えます。

TextBlock textEntry = new TextBlock();
Grid.SetRow(textEntry, rowIndex);
Grid.SetColumn(textEntry, columnIndex);
if (currentEntry > offset)
    textEntry.Text = currentEntry.ToString();
currentEntry++;

編集:コメントに基づいて、最初にコントロールを作成するときにメソッドを実行してグリッドを構築し、すべてのテキストフィールドにデータを入力して、ある種のリストに保存します。

private int Rows = 2;
private int Columns = 5;
private TextBlock[][] TextEntries;

private void CreateTextBlocks()
{
    TextEntries = new TextBlock[Rows][];
    for (int rowIndex = 0; rowIndex < rows; rowIndex++)
    {
        entries[rowIndex] = new string[columns];
        for (int columnIndex = 0; columnIndex < columns; columnIndex++)
        {
            TextBlock textEntry = new TextBlock();
            Grid.SetRow(textEntry, rowIndex);
            Grid.SetColumn(textEntry, columnIndex);
            myGrid.Children.Add(textEntry);

            TextEntries[rowIndex][columnIndex] = textEntry;
        }
    }
}

次に、別のメソッドを実行して、必要に応じて値を変更します。

private void fillDate(int offset)
{
    int currentEntry = 1;

    for(int rowIndex = 0; rowIndex < Rows; rowIndex++)
    {
        for (int columnIndex = 0; columnIndex < Columns; columnIndex++)
        {
            TextBlock textEntry = TextEntries[rowIndex][columnIndex]

            if (currentEntry > offset)
                textEntry.Text = currentEntry.ToString();
            else
                textEntry.Text = String.Empty;

            currentEntry++;
        }
    }
}
于 2012-09-05T16:17:15.863 に答える