현재 WPF를 사용하여 약간의 Battleship 응용 프로그램을 만들려고합니다. 어떤 사람들은이를 위해 MVVM 패턴을 광고 했으므로 WPF 또는 Forms에 대한 경험이 없습니다. 처음 몇 가지 문제가 있으면 모든 것이 잘 진행되고있는 것 같지만 지금 당장 벽을 뚫고 나갈 것입니다.MVVM : 데이터가 변경 될 때 캔버스에서 도면 업데이트
상상할 수있는 것처럼, 전함 "그리드"가 있습니다. WPF 그리드와 혼란 스럽지만, 대신에 내가 사용할 수있는 아이디어가 생겼다. 생각해 보자.하지만 다음 질문에 대한 답은 여전히 캔버스에 그리기를 원한다. 이전에 MVVM없이 성공했지만 MVVM을 사용하여 수행하는 방법을 알지 못합니다. 캔버스에 그려진 "그리드"는 항상 인 11 가로 및 11 세로 선과 선 (교차 선으로 정의 된 사각형 중 하나에있는 모든 모양으로 구성 될 수 있음)으로 구성되어야합니다. 내 BSGrid의 코드 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Battleship.Entities
{
public class BSGrid
{
public const int Size = 10;
// TileState is an enum consisting of Unchecked, Checked, ShipPart,...
private TileState[,] sea = new TileState[Size, Size];
public TileState this[BSPoint pos]
{
get { return sea[pos.x, pos.y]; }
set { sea[pos.x, pos.y] = value; }
}
public TileState this[int x, int y]
{
get { return sea[x, y]; }
set { sea[x, y] = value; }
}
public BSGrid()
{
}
}
}
당신이 BSGrid의 데이터에 캔버스 "내용"를 결합하는 방법으로 어떤 제안이 있습니까? 이전에 그림을 그렸을 때 타일이나 배 부분에 배 부분이 있으면 사각형을 그렸습니다. 필자는 당연히 그릴 수있는 Rect List에 그리드의 일부 데이터를 추출 할 수 있었지만 이것이 "좋을지"는 모르겠지만 여전히 ViewModel에서 그리는 방법을 알지 못합니다. 조금도. 나는 이것이 BSGrid
에 대한 DependencyProperty
내 자신의 클래스
public class BattleshipCanvas : Canvas
{
// ...
}
를 작성하여 일을 가지고 WPF에서 '표준 관행'의 일종으로 내가
[This answer] (http://stackoverflow.com/a/22325266/1136211)에서 볼 수 있듯이 ItemsControl의 ItemsPanel 인 Canvas에서 선박을 직사각형으로 모델링 할 수 있습니다. – Clemens
@ 클레멘스 (Clemens) 나는 여기에 해결책을 찾을 때까지 그 하나를 발견했다고 생각하지만, 어떤 이유로 그것을 버렸다. 당분간 MVVM없이 게임을 시작했지만 대답은 여전히 흥미 롭습니다 (위에서 쓴 것처럼). 나는 다른 대답을 일반화하여 사용할 수 있다고 생각합니다. 감사! – InvisiblePanda
절대 좌표 대신 그리드 셀 인덱스를 사용하려면 캔버스를 그리드로 바꾸고 'Grid.Column','Grid.Row','Grid.ColumnSpan' 및'Grid.RowSpan' 속성을 ItemStyle 및 ItemTemplate입니다. – Clemens