自定义控件,后台不会改变
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义控件,后台不会改变相关的知识,希望对你有一定的参考价值。
所以我制作了一个自定义控件,包含一个按钮和一个图像。我创造了64个棋盘。
for (int i = 1; i <= 8; i++)
{
for (int j = 1; j <= 8; j++)
{
Square field = new Square(i, j, this);
field.Click += OnFieldClick;
squares[i - 1, j - 1] = field;
squares_list.Add(field);
Square_control fieldBase = new Square_control(field);
this.table.Children.Add(fieldBase);
Grid.SetRow(fieldBase, j - 1);
Grid.SetColumn(fieldBase, i - 1);
}
}
Square是一个继承自Button类的类。它的背景是在它的构造函数中设置的。
Square_Control
是我的自定义控件,包含一个按钮和一个图像。它的构造函数将按钮设置为参数。
感谢调试器,我发现在字段和fieldBase
对象中正确设置了黑色和白色,但是当我运行程序时,所有按钮都是白色的。我觉得我错过了一些关于WPF如何工作的重要知识。
Square
构造函数:
public Square(int row, int col, MainWindow wind)
{
if ((row + col) % 2 == 0)
isWhite = true;
else
isWhite = false;
colName = col;
rowName = row;
if (this.isWhite)
SquareColor = wind.BasicWhite;
else
SquareColor = wind.BasicBlack;
Background = SquareColor;
window = wind;
}
BasicWhite = new SolidColorBrush(new Color()
{
R = 255,
B = 255,
G = 255,
A = 255
});
BasicBlack = new SolidColorBrush(new Color()
{
R = 0,
B = 0,
G = 0,
A = 255
});
Square_control xaml:
<Button x:Name="SQR">
<Image x:Name="FigImage"/>
</Button>
它的构造函数:
public Square_control(Button butt)
{
InitializeComponent();
SQR = butt;
}
另外,我尝试在XAML中直接在Square_Control中设置背景颜色并且它有效。
答案
你确实做得不好。
首先,你已经有一个Square
控制;你需要什么Square_control
?
你甚至不需要Square
;只需制作一个新的UserControl
并将你的Button
和你的Image
放入其中。
如果你需要进一步的专业化(比如IsWhite
属性),你可以将它作为依赖属性添加到这个UserControl
中。
并简单地将所需的参数(x,y)传递给它的构造函数。
你可以从这样的事情开始:
public partial class ChessSquare : UserControl
{
public enum Piece
{
King,
Queen,
Rook,
Bishop,
Knight,
Pawn,
None
}
public readonly SolidColorBrush BasicWhite = new SolidColorBrush(new Color { R = 255, G = 255, B = 255, A = 255 });
public readonly SolidColorBrush BasicBlack = new SolidColorBrush(new Color { R = 0, G = 0, B = 0, A = 255 });
public Boolean IsWhite
{
get { return (Boolean)this.GetValue(IsWhiteProperty); }
set
{
this.SetValue(IsWhiteProperty, value);
this.Background = value ? BasicWhite : BasicBlack;
}
}
public static readonly DependencyProperty IsWhiteProperty = DependencyProperty.Register(
nameof(IsWhite), typeof(Boolean), typeof(ChessSquare), new PropertyMetadata(false, new PropertyChangedCallback(OnIsWhitePropertyChanged)));
public Piece PieceType
{
get { return (Piece)this.GetValue(PieceProperty); }
set { this.SetValue(PieceProperty, value); }
}
public static readonly DependencyProperty PieceProperty = DependencyProperty.Register(
nameof(PieceType), typeof(Piece), typeof(ChessSquare), new PropertyMetadata(Piece.None, new PropertyChangedCallback(OnPieceTypePropertyChanged)));
public ChessSquare(int row, int col)
{
InitializeComponent();
IsWhite = (row + col) % 2 == 0;
}
private static void OnIsWhitePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var square = (ChessSquare)d;
square.Background = (bool)e.NewValue ? square.BasicWhite : square.BasicBlack;
}
private static void OnPieceTypePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// change the image, set it to null is the value is Piece.None
}
}
并最终用this.Background
替换this.button.Background
,具体取决于你如何在这个UserControl的相关XAML中命名。
以上是关于自定义控件,后台不会改变的主要内容,如果未能解决你的问题,请参考以下文章
自定义WPF控件(MyTextBoxMyDatePickerMyDataGrid)