0

わかりました、これは私が調査を行っていないかのように聞こえるかもしれませんが、調査を行いました。私はこのフォームを持っています:

ここに画像の説明を入力

ラベルとテキストボックスを動的に追加することで、必要な数のプレーヤーに使用したいと思います。しかし、私は真ん中のスペースが非常に退屈だと思います。コンポーネントの数に応じて、コンポーネントを一種のパックに設定するにはどうすればよいですか。Javaを使っていた記憶がありますが、コンポーネントをパックする方法がありましたが、C#にはそのようなものはないようです。アンカーとドックについて調べましたが、もっと簡単な方法があるといいのですが?

そうでない場合は、どうすればいいですか?

4

2 に答える 2

0

UniformGridを使用してみることができます (既定では Visual Studio ツールボックスに含まれていない可能性がありますが、手動で追加できます)。たとえば、XAML コードは次のようになります。

<UniformGrid HorizontalAlignment="Center" Name="uniformGrid1" VerticalAlignment="Stretch" Width="200" Columns="1" />

コントロールをUniformGridに追加するコードは次のようになります。

TextBox tb = new TextBox();
tb.Width = 100;
tb.Height = 26;
Label lbl = new Label();
lbl.Content = "Player:";
Canvas canvas = new Canvas();
Canvas.SetLeft(lbl, 10);
Canvas.SetTop(lbl, 5);
Canvas.SetLeft(tb, 60);
Canvas.SetTop(tb, 5);
canvas.Children.Add(lbl);
canvas.Children.Add(tb);
uniformGrid1.Children.Add(canvas);

ちなみに、フォントの色は白(またはコントラストの良い他の色)にする必要があると思います。

于 2012-12-29T02:11:17.450 に答える
0

「PlayerNo」(Int32) や「PlayerName」(String) などのプロパティを保持するクラスを作成します。クラスを「PlayerInfo」と呼びましょう。

次に、PlayerInfo の ObservableCollection を作成し、そこにプレイヤーの数を追加します。それをプレーヤーと呼びましょう。XAML でクラスを使用できるように、すべてのプロパティに対して Dependency Property を作成し、UI が自動的に更新されるように INotifyPropertyChanged を無視します。

this.Players = new ObservableCollection<PlayerInfo>();
this.Players.Add(new PlayerInfo() { PlayerNo=0, PlayerName=null });
this.Players.Add(new PlayerInfo() { PlayerNo=1, PlayerName=null });
this.Players.Add(new PlayerInfo() { PlayerNo=2, PlayerName=null });

次に、ItemsSource からモデル クラスの Players プロパティへのバインドを持つ ItemsPresenter コントロールを XAML で作成します。前のラウンドのプレーヤーなどに基づいて「PlayerName」などを入力することもできます。「null」に設定して説明しました(もちろんこれは必須ではなく、単なる説明です)。

<ItemsControl ItemsSource="{Binding Path=Players, Mode=OneWay}">
  <ItemsControl.ItemsPanel>
    <StackPanel Orientation="Vertical" />
  </ItemsControl.ItemsPanel>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Horizontal" Margin="0,20,0,0">
        <TextBlock Text="Player" />
        <TextBlock Text="{Binding Path=PlayerNo, Mode=OneWay}" Margin="10,0,20,0" />
        <TextBox Text="{Binding Path=PlayerName, Mode=TwoWay}" Width="200" />
      </StackPanel>
    </DataTemplate>
  <ItemsControl.ItemTemplate>
</ItemsControl>

ItemsPresenter クラスの場合、「Player」の後に「PlayerId」番号が続く TextBlock を保持する ItemTemplate を作成します。そして、Text プロパティからアイテムの「PlayerName」プロパティへのバインドを持つ TextBox を使用します。

この方法では、分離コードと XAML はほとんどありません。それは簡単な解決策です。また、プレーヤーの詳細もすべて使用できる状態にします。

于 2012-12-29T10:19:52.913 に答える