5

Winformsで何年も開発してきましたが、今はWPFに切り替えてチェス盤を作りたいと思っています。残念ながら、どこから始めればよいのかわかりません。WPFを使用すると、非常に確信が持てなくなり、再び初心者のように感じます。誰かが基本的なデザインの概要を説明できますか?私は8x8グリッドから始めて、正方形には長方形を使用し、ピースには画像を使用すると思います。その後?私は何かが足りないのですか?

編集:それはちょうどユーザーインターフェースについてです。舞台裏で何が起こっているかは問題ありません。

4

5 に答える 5

10

標準グリッドの代わりにUniformGrid( msdn リンク) を使用できます。

常に同じサイズのセルが得られるため、おそらくこれに適しています(私の意見では)。

使用アラ:

<UniformgGrid Columns="8" Rows="8">
    <Control1/>
    <Control2/>
    <Control3/>
</UniformGrid>

これらの答えはどれも、あなたが望む結果をもたらします。

于 2009-12-27T16:32:03.030 に答える
6

Chess は、WPF の MVVM コード パターンに適しているようです。

モデルはチェスのゲームのロジックになります。それを制御できるように思えます。ViewはゲームのWPF の外観になり、ViewModelはゲームの表現になり、View がデータバインドできるようになります。

ビューの場合、UniformGrid を使用する ItemsControl は、ゲームの 2D 表現で機能します。

ここから始めます (チェックなし)

<ItemsControl ItemsSource="{Binding TheGame}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="8" Rows="8" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ContentControl Background="{Binding SquareColor}">
                <Path Data="{Binding PieceShape}" Fill="{Binding PieceColor}" />
            </ContentControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

上記が機能するためには、ViewModel に が必要であり、およびObservableCollection<ChessGridItem>のDependencyProperties を公開するChessGridItem必要があります。DependencyObjectSquareColorPieceColorPieceShape

于 2009-12-27T18:15:13.830 に答える
1

XAML またはコードで UI を実行すると、同じ結果が得られます。最近 WPF を使い始めたので、XAML アプローチをお勧めします。最初は少し怖いですが、すぐに慣れます。私には、これはよく考えられた UI 設計のアプローチのように感じられます。今の WinForms は、以前のものに .NET を平手打ちしただけのように見えます。

ドラッグ アンド ドロップのアプローチから始めることもできますが、私のような場合は、XAML で非常に迅速に作業し、デザイン サーフェイスを使用して視覚的なチェックを行うことになります。

これはおそらく私が行う方法ではありませんが、XML または HTML を見たことがある場合は、XAML を見たことがない場合でも、これが何を表示するかを推測できるでしょう。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="100" />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="100" />
        <RowDefinition Height="100" />
        <RowDefinition Height="100" />
        <RowDefinition Height="100" />
    </Grid.RowDefinitions>

    <Border Grid.Column="0" Grid.Row="0" Background="Black" />
    <Border Grid.Column="2" Grid.Row="0" Background="Black" />
    <Border Grid.Column="1" Grid.Row="1" Background="Black" />
    <Border Grid.Column="3" Grid.Row="1" Background="Black" />
</Grid>
于 2009-12-27T16:20:12.567 に答える
0

ここに投稿されたすべてのサンプルに同意しますが、WPF の「データ」の「テンプレート」モデルが、WinForms の純粋に密接にバインドされた UI + データ モデルとはまったく異なるため、少し混乱していると思います。

WinForm から WPF に移行するのは、学習曲線が大きくないためです。私自身、WPF でコーディングを開始するのに 2 年かかりました。

私の最善の推測では、最初に WPF の「論理ツリー」と「ビジュアル ツリー」の概念を調べる必要があります。これにより、WPF の UI 要素と非 UI 要素 (データ オブジェクト) が、C# を記述せずに XAML で簡単に接続できることがわかります。

そして、「トリガー」のようなもう 1 つの最も重要な概念。

作成する必要があるのは、IPropertyChanged インターフェイスを実装する 1 つの共通の基本クラスから派生したチェス アイテム (キング、ホース) となる「データ」オブジェクトだけであり、単純にバインドできる「CanBeKilled」、「IsPossibleTarget」などのプロパティを実装します。 ListBox が現在の選択を保持する ListBox の ItemTemplate で。

ListBox のアイテム パネル テンプレートは上記の例のいずれかであり、MouseOver では、上記のプロパティに従って色または境界線を強調表示できます。あとは、選択が変更されたときに、ListBox 内のすべてのアイテムのブール プロパティを更新するだけです。

編集部分を読んだところですが、WinForms と比較すると、適切に設計された WPF は WinForm と比較してコードの背後にあるコードが 90% 少ないため、WPF のコード ビハインドは異なって単純でなければならないと思います。

于 2009-12-28T08:05:46.803 に答える
0

いいえ、あなたが何かを見逃しているとは思いません。それは良いスタートです。

グリッドを作成し、列と行を追加します。次に、長方形を交互のセル (または画像) にドロップします。四角形の塗りつぶしの色と線のスタイルを作成します。これにより、変更が必要なセルごとではなく、1 つの場所 (スタイル定義) で背景色を変更できます。

これは、グリッドを使用した非常に基本的なボードです。行と列のサイズをハードコーディングしていないことに注意してください。これにより、すべてのバランスが保たれ、ボードのスケーリングが可能になります。

    <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Name="A1"  />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Rectangle Name="rectangle1"
               Stroke="Black" Fill="Aquamarine" />
</Grid>
于 2009-12-27T16:07:39.423 に答える