Как нарисовать конкретную ячейку стековой панели? - PullRequest
0 голосов
/ 21 октября 2018

Чтобы нарисовать матрицу ячеек, я использовал Stackpanel, определяемую этим кодом:

    int columns = Convert.ToInt32(columnasText.Text);
    int rows = Convert.ToInt32(filasText.Text);
    SolidColorBrush selected1 = new SolidColorBrush(Colors.Aquamarine);       
    SolidColorBrush released = new SolidColorBrush(Colors.White);


            for (int i = 0; i < rows; i++)
            {
                StackPanel stkPanel = new StackPanel();
                stkPanel.Orientation = Orientation.Horizontal;


                for (int j = 0; j < columns; j++)
                {
                    Label lbl = new Label();
                    lbl.Height = rejilla.Height / rows;
                    lbl.Width = rejilla.Width / columns;


                    lbl.Tag = new Point(i, j); 
                    lbl.BorderBrush = new SolidColorBrush(Colors.Black);
                    lbl.BorderThickness = new Thickness(1);                     
                    lbl.Background = released;                                                                                          
                    stkPanel.Children.Add(lbl);
                }

                rejilla.Children.Add(stkPanel);

После определения мне нужно изменить цвета каждой ячейки в зависимости от значений каждогои я не могу это сделать.

1 Ответ

0 голосов
/ 22 октября 2018

Я использовал вашу переменную rejilla (я предполагаю, что это либо StackPanel, либо Grid).В любом случае, это будет работать.

Метод 1:

Ключ использует .Children.OfType ()

//Get your cell location
int rowIndex = 2;
int columnIndex = 8;

//Get your desired new color
SolidColorBrush selected1 = new SolidColorBrush(Colors.Aquamarine);

//Get list of your row panels
var stackPanels = rejilla.Children.OfType<StackPanel>().ToList();

//Check if desired row panel exist
if (rowIndex < stackPanels.Count && rowIndex >= 0)
{
    //Get list of your labels in the desired row panel
    var labels = stackPanels[rowIndex].Children.OfType<Label>().ToList();

    //Check if desired cell exist or not then change background
    if (columnIndex < labels.Count && columnIndex >= 0)
        labels[columnIndex].Background = selected1;
}

Метод 2:Использование установленного вами тега (точка)

Не рекомендуется, этот метод был бы полезен, если бы вы поместили все свои метки в одну панель стека, а не в несколько панелей стека (по одной панели стека для каждой строки).

//Get your cell location
int rowIndex = 2;
int columnIndex = 8;

//Get your desired new color
SolidColorBrush selected1 = new SolidColorBrush(Colors.Aquamarine);

//Get list of your row panels
var stackPanels = rejilla.Children.OfType<StackPanel>().ToList();

//Check if desired row panel exist
if (rowIndex < stackPanels.Count && rowIndex >= 0)
{
    //Get list of your labels in the desired row panel
    var label = stackPanels[rowIndex].Children.OfType<Label>()
        .Where(Item => (int)(Item.Tag as Nullable<Point>).GetValueOrDefault().X == rowIndex
        && (int)(Item.Tag as Nullable<Point>).GetValueOrDefault().Y == columnIndex).FirstOrDefault();

    if(label != null)
        label.Background = selected1;
}

Вы можете поместить код в метод и передать свой stackPanel, color, rowIndex, columnIndex:

private void SetCellColor(StackPanel stackPanel, SolidColorBrush color, int rowIndex, int columnIndex)
{
    //Get list of your row panels
    var stackPanels = stackPanel.Children.OfType<StackPanel>().ToList();

    //Check if desired row panel exist
    if (rowIndex < stackPanels.Count && rowIndex >= 0)
    {
        //Get list of your labels in the desired row panel
        var labels = stackPanels[rowIndex].Children.OfType<Label>().ToList();

        //Check if desired cell exist or not then change background
        if (columnIndex < labels.Count && columnIndex >= 0)
            labels[columnIndex].Background = color;
    }
}

Затем вызвать его:

SetCellColor(rejilla, new SolidColorBrush(Colors.Aquamarine), rowIndex, columnIndex);

Удачи!

...