自定义控件,后台不会改变

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)

在winform画了一个自定义控件,现在我要在运行后进行拉伸动态改变大小,但快速拉伸就闪烁,怎么消除

winform用户控件timer控件三级联动

WPF 自定义控件并使用(例如带水印和字体图标的文本框)

从android中的片段更改自定义ActionBar标题

android关于自定义seekbar控件的问题(将横向seekbar改成竖向seekbar)