以下を実装したい:最初に3つのボタンで空のウィンドウがある。ボタンをクリックすると、ウィンドウ内にSize*Size
ボタンを生成したいと思います。ボタン1はSize=6
、ボタン2はSize=8
、ボタン3はSize=0
ですので、UniformGrid
を作成し、そのサイズをSize
にバインドすると、ボタンの数を変更できます。最初はSize
が0になるため、ボタンは表示されず、Size
が変更されるとボタンが表示されます。しかし、これは機能しません。私がしようとしている:WPFを使用したC# - 実行時にサイズ変更可能なボタンのグリッドを作成する
<Window x:Class="project.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="500" Width="700">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Menu Grid.Column="1" Margin="38,0,187,430" Background="White">
<MenuItem Header="Level 1" FontFamily="Roboto" Height="32" Width="65"
Command="{Binding Lvl1Command}"/>
<MenuItem Header="Level 2" FontFamily="Roboto" Height="32" Width="65"
Command="{Binding Lvl2Command}"/>
<MenuItem Header="Level 3" FontFamily="Roboto" Height="32" Width="65"
Command="{Binding Lvl3Command}"/>
</Menu>
<ItemsControl Grid.Column="2" ItemsSource="{Binding Fields}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="{Binding Size}" Columns="{Binding Size}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Focusable="False" RenderTransformOrigin="0.5, 0.5"
Width="30" Height="25" FontSize="24" FontWeight="Bold">
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Window>
Size
は最初は0で、Lvl1Command
変更サイズを6に、Lvl2Command
など8にFields
は、ボタンのスタイルに影響を与えるいくつかのプロパティを保存するだけでデータ構造です。サイズを変更したときに表示されるボタンの数も変わらないように、どうすればこの問題を修正できますか?ありがとうございました!
のViewModelコンストラクタでEDIT :
Lvl1Command = new DelegateCommand(param => { SetUpGame(MLModel.Level.Easy); });
Lvl2Command = new DelegateCommand(param => { SetUpGame(MLModel.Level.Medium); });
Lvl3Command = new DelegateCommand(param => { SetUpGame(MLModel.Level.Hard); });
そしてSetUpGame()
はこのようになります(Field
が含まれています):
private void SetUpGame(MLModel.Level level)
{
UpCommand = new DelegateCommand(param => { _model.MoveUp(); RefreshTable(); });
DownCommand = new DelegateCommand(param => { _model.MoveDown(); RefreshTable(); });
LeftCommand = new DelegateCommand(param => { _model.MoveLeft(); RefreshTable(); });
RightCommand = new DelegateCommand(param => { _model.MoveRight(); RefreshTable(); });
// időzítő létrehozása
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromSeconds(1);
_timer.Tick += new EventHandler(Timer_Tick);
_timer.Start();
_model.SetLevel(level);
_model.NewGame();
Fields = new ObservableCollection<MLField>();
for (Int32 i = 0; i < _model.Table.Size; i++)
{
for (Int32 j = 0; j < _model.Table.Size; j++)
{
Fields.Add(new MLField
{
Text = _model.Table[i, j],
X = i,
Y = j,
Number = i * _model.Table.Size + j
});
}
}
RefreshTable();
}
そしてSize
:
public Int32 Size { get { return _model.Size; } }
あなたは 'Lvl1Command'、' Lvl2Command'、 'Lvl3Command'、' Fields'、 'Size'のviewModelコードを表示できますか? – ASh
@AShはあなたがリクエストしたコードを追加しました! :) –
あなたが話しているメソッドは、 'NotifyPropertyChanged'(インターフェイス名としてちょうどかなりです!)または' RaisePropertyChanged' ... 'OnPropertyChanged'という名前は、_handler_というイベント –