0

WPF について詳しく学ぶためにビンゴ カード ジェネレーターを作成していますが、コード ビハインド ファイルのプロパティからラベル コンテンツ プロパティを設定する方法がわかりません。

使えると思った

<Setter Property="Content" Value="{Binding BNumber}">

content プロパティで、ラベルのコンテンツを my のランダムな要素に設定するList<String>?

私はMainWindow.xamlに持っています

<Window x:Class="Bingo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="600" Width="800"
        WindowStartupLocation="CenterScreen">
  <Grid>
    <Grid Width="350" Height="420" ShowGridLines="True">
      <Grid.RowDefinitions>
        <RowDefinition Height="70"/>
        <RowDefinition Height="70"/>
        <RowDefinition Height="70"/>
        <RowDefinition Height="70"/>
        <RowDefinition Height="70"/>
        <RowDefinition Height="70"/>
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="70" />
        <ColumnDefinition Width="70" />
        <ColumnDefinition Width="70" />
        <ColumnDefinition Width="70" />
        <ColumnDefinition Width="70" />
      </Grid.ColumnDefinitions>
      <!-- The Label I'm trying to set in this example -->
      <Label Grid.Column="0" Grid.Row="1" Style="{StaticResource BNumber}"
             FontSize="50" Width="70"/>
    </Grid>
  </Grid>
</Window>

私のApp.xamlコード

<Application x:Class="Bingo.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
  <Application.Resources>
    <Style TargetType="Label" x:Key="BNumber">
      <Setter Property="Content" Value="{Binding}"></Setter>
      <Setter Property="Background">
        <Setter.Value>
          <SolidColorBrush Color="Beige"/>
        </Setter.Value>
      </Setter>
    </Style>
  </Application.Resources>
</Application>

私のMainWindow.xaml.csには、このオブジェクトと、リストList<String> BNumbersのランダムな要素を返すプロパティがありますBNumbers

public MainWindow() {
  InitializeComponent();
  BNumbers.Add("1");
  BNumbers.Add("2");
  BNumbers.Add("3");
  BNumbers.Add("4");
  BNumbers.Add("5");
  BNumbers.Add("6");
  BNumbers.Add("7");
  BNumbers.Add("8");
  BNumbers.Add("9");
  BNumbers.Add("10");
  BNumbers.Add("11");
  BNumbers.Add("12");
  BNumbers.Add("13");
  BNumbers.Add("14");
  BNumbers.Add("15");
}
public string RandomBNumber {
  get { return randomB(); }
}
public string randomB() {
  Random rand = new Random();
  int randomBNumber = rand.Next(0, 15);
  return BNumbers[randomBNumber];
}
public List<String> BNumbers = new List<string>();
4

2 に答える 2

3

重複を防ぐため、リスト自体をランダム化してから各番号をランダム化する方が簡単かもしれません。

また、Uniform グリッドを使用すると、多数のラベルを追加する方が簡単な場合があります。

例:

Xaml:

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="346" Width="300" Name="UI">

    <Grid DataContext="{Binding ElementName=UI}">
        <ItemsControl ItemsSource="{Binding BNumbers}" Margin="0,29,0,0">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border Margin="1" BorderBrush="Black" BorderThickness="1" CornerRadius="2">
                         <Label Content="{Binding}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"  />
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="5" Rows="5"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
        <Button Content="New" Height="23" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
 </Window>

コード:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public List<string> AllNumbers { get; set; }
    private List<string> _bnumbers = new List<string>();

    public MainWindow()
    {
        InitializeComponent();
        AllNumbers = new List<string>();
        // Bingo game 75 numbers, 5x5 grid
        for (int i = 0; i < 75; i++)
        {
            AllNumbers.Add(i.ToString());
        }
    }

    public List<string> BNumbers
    {
        get { return _bnumbers; }
        set { _bnumbers = value; NotifyPropertyChanged("BNumbers"); }
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        RandomizeList(AllNumbers);
        BNumbers = AllNumbers.Take(25).ToList();
    }

    private void RandomizeList<T>(IList<T> list)
    {
        Random rng = new Random();
        int n = list.Count;
        while (n > 1)
        {
            n--;
            int k = rng.Next(n + 1);
            T value = list[k];
            list[k] = list[n];
            list[n] = value;
        }
    }

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

結果(「新規」は新しいゲームを生成します)

ここに画像の説明を入力

于 2013-01-07T23:18:59.817 に答える
2

コンストラクターでは、DataContext を設定する必要があります。

this.DataContext = this;

また、プロパティ名 RandomBNumber と一致するようにセッターを変更する必要があります。

<Setter Property="Content" Value="{Binding RandomBNumber }">
于 2013-01-07T22:42:48.780 に答える