الساحات سلط الضوء على رقعة الشطرنج CustomControl لا تستمر إلى ما بعد الحدث MouseDown الأولي
سؤال
ولقد تم ترميز التطبيق لعبة الشطرنج Windows في C # باعتبارها ممارسة في صقل مهاراتي، وأيضا لأنه متعة. ولقد تضمنت الوظائف التي يسمح لاعب لتحديد الخيار لتسليط الضوء على الساحات قطعة يمكن ان تتحرك قانونيا عندما يحصل النقر فوقه. A CustomControl مقابض جعل من رقعة الشطرنج ويسلط الضوء أيضا على الساحات.
ويعمل كل شيء كما هو مخطط لها حتى يبدأ لاعب لسحب قطعة إلى مربع جديد. لحظة تحرك الماوس، ويسلط الضوء تزول. وأظن أن يتم رفع الحدث الطلاء والمجلس يعيد رسم نفسه. ومنذ أبرز ليست جزءا من تخطيط لوحة الأولي، فإنها لا تحصل على الانتباه.
ما أود أن يحدث هو للالساحات أن يبقي أبرز حتى يتم إسقاط قطعة في مربع وجهتها. هل من الممكن تحقيق ذلك؟ سيكون موضع تقدير أي اقتراحات.
وكود الزائف:
void piece_MouseDown(object sender, MouseEventArgs e)
{
Piece piece = (Piece)sender;
legalSquares = CalculateLegalSquares(piece.CurrentSquare);
if (legalSquares.Count > 0 && this.showLegalMoves)
{
chessBoard1.HighlightSquares(legalSquares);
}
// I believe a Paint event gets raised either here...
piece.DoDragDrop(piece, DragDropEffects.Move);
}
void piece_DragEnter(object sender, DragEventArgs e)
{
// ...or here, that removes the highlights.
if (e.Data.GetDataPresent("Chess.Piece"))
{
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
}
void piece_DragDrop(object sender, DragEventArgs e)
{
Piece piece = (Piece)e.Data.GetData("Chess.Piece");
if (piece.CurrentSquare != dropSquare)
{
if (legalSquares.Contains(dropSquare))
{
// This is where I’d like the highlights to stop
// DoStuff()
}
}
}
المحلول
وهذا يبدو وكأنه كنت تسليط الضوء على الساحات صالحة من خلال الاعتماد بشكل مباشر، ولكن هذا لن يحصل تمحى على أي إعادة رسم. من المحتمل أن تفقد أبرز إذا تم طلاؤها نافذتك لأسباب أخرى أيضا، مثل تقليل واستعادتها، أو سحب نافذة أخرى على أعلى من ذلك.
وإذا كان هذا هو الحال، وربما كنت بحاجة إلى تجاوز أسلوب OnPaint والقيام إبراز هناك. عندما تريد تغيير ما يتم تمييز، تعيين بعض الدول في صفك للسيطرة على ما يتم رسمها على النحو المبين في طريقة OnPaint، ومن ثم يبطل نافذة.