環境
VisualStudio2017(WPF)
実現したいこと
やりたいのは上画像の6*5のすべての目に5種類のピースの画像をランダムに並べることです。
現状はSTARTボタンをクリックするとピースが並べられるようにしているつもりですが、ボタンを押しても何も表示されない状態です。
以下、ソースと現状の詳細を記載します。
インデクサのBindingに失敗していそうだと思っているのですが、どこが悪いでしょうか?
開発経験はなくC#を触り始めたばかりの初心者のため、かなりお見苦しいコードになっていると思いますが、ご回答のほどよろしくお願いします。
###現状のソース
xaml
1<Window x:Class="Pazzle.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:PazDra" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="700" Width="500"> 9 <Grid> 10 <Button x:Name="btn_GemGenerate" Content="START" HorizontalAlignment="Center" Margin="0,200,0,0" VerticalAlignment="Top" Width="100" Height="50" FontSize="20" Click="button_Click_START"/> 11 <Grid x:Name="BoardGrid" HorizontalAlignment="Center" Margin="0,0,0.0,0" VerticalAlignment="Bottom" ShowGridLines="True" Height="300" Width="350" Grid.ColumnSpan="4" Opacity="0.985"> 12 <Grid.ColumnDefinitions> 13 <ColumnDefinition Width="*"/> 14 <!--6列。長いので以下略--> 15 </Grid.ColumnDefinitions> 16 <Grid.RowDefinitions> 17 <RowDefinition Height="*"/> 18 <!--5行。長いので以下略--> 19 </Grid.RowDefinitions> 20 <!--インデクサPeace[x][y]をImageのSourceにBindingし、下のC#のソースでモデル上の盤面に配置した各要素を表示する。--> 21 <Image x:Name="GridCell0_0" Source="{Binding Path=Peace[0][0]}" Margin="1" Grid.Row="0" Grid.Column="1"/> 22 <Image x:Name="GridCell1_0" Source="{Binding Path=Peace[1][0]}" Margin="1" Grid.Row="0" Grid.Column="1"/> 23 <Image x:Name="GridCell2_0" Source="{Binding Path=Peace[2][0]}" Margin="1" Grid.Row="0" Grid.Column="2"/> 24 <Image x:Name="GridCell3_0" Source="{Binding Path=Peace[3][0]}" Margin="1" Grid.Row="0" Grid.Column="3"/> 25 <!--盤上のすべての目に画像をBinding。配列の記法はPeace[,]のほうが正しいかも。現状はどちらの記法でも動かない--> 26 <!--長いので以下略--> 27 </Grid> 28 </Grid> 29</Window>
c#
1/// MainWindow.xaml の相互作用ロジック 2 3namespace Pazzle 4{ 5 public partial class MainWindow : Window 6 { 7 public MainWindow() => InitializeComponent(); 8 9 //STARTボタンをクリックすると盤上にピースが配置される。 10 private void button_Click_START(object sender, RoutedEventArgs e) 11 { 12 Board board = new Board(); 13 GridCell0_0.DataContext = board; 14 } 15 } 16} 17
C#
1//2次元配列の添え字でアクセスして盤上のピースを配置、取得するインデクサ 2namespace Pazzle 3{ 4 class Peaces 5 { 6 public const int WIDTH = 6; 7 public const int HEIGHT = 5; 8 string[,] PeaceImg = new string[HEIGHT, WIDTH]; 9 public string this[int X, int Y] 10 { 11 set 12 { 13 this.PeaceImg[X,Y] =value; 14 } 15 get 16 { 17 return this.PeaceImg[X,Y]; 18 } 19 } 20 } 21}
c#
1//盤面を表すモデル 2 3namespace Pazzle 4{ 5 class Board 6 { 7 //盤面は6*5 8 public const int WIDTH = 6; 9 public const int HEIGHT = 5; 10 11 //ピースの画像ファイルへのパス 12 public const string PEACE_A = @"C:\hoge\hoge"; 13 public const string PEACE_B = @"C:\hoge\fuga"; 14 public const string PEACE_C = @"C:\fuga\hoge"; 15 public const string PEACE_D = @"C:\fuga\fuga"; 16 public const string PEACE_E = @"C:\piyo\piyo"; 17 18 //ピースは5種類 19 public static readonly string[] PeaceType = new string[] 20 { 21 PEACE_A,PEACE_B,PEACE_C,PEACE_D,PEACE_E 22 }; 23 24 int seed; //乱数生成用のシード値 25 public Peaces peace = new Peaces();//盤上の目に配置するピースを表すインデクサ 26 public Board() 27 { 28 for (int i = 0; i < HEIGHT; i++) 29 { 30 for (int j = 0; j < WIDTH; j++) 31 { 32 seed = System.Environment.TickCount; 33 Random rnd = new System.Random(seed++); 34 peace[i, j] = PeaceType[rnd.Next(4)]; 35 //盤上のすべての目にランダムに4種のピースを配置 36 } 37 } 38 } 39 } 40}
###現状
######実現できていること
- STARTボタンを押下するとPeace[x][y]のすべての要素に画像のパスは入ります。
######実現できていないこと
- Peace[x][y]に入っているはずの画像がView上に表示できません。
xamlでimage要素の代わりにTextBlockを使って、画像ではなくパスの文字列を表示することも試しましたが、文字列でも表示できませんでした。
- ループ内でシード値をインクリメントして変えながら乱数を生成しているのですが、すべて同じ種類のピースになってしまいます。
(デバッグモードでゆっくりとステップ実行すると違う種類になるのですが。。。)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/10/07 09:00 編集
退会済みユーザー
2020/10/08 00:22