Событие загрузки столбца для установки поля дочерних элементов

Я пытаюсь динамически установить поле текстового блока, чтобы он помещался в центр родительского столбца после загрузки указанного столбца, но получаю сообщение об ошибке Ожидается имя метода, когда я вызываю свой метод SetManga.

    public void GetManga(List<Manga> mangaList)
    {
        stkPnlImages.Children.Clear();
        Grid imagesGrid = new Grid();
        imagesGrid.HorizontalAlignment = HorizontalAlignment.Left;
        imagesGrid.ColumnDefinitions.Add(new ColumnDefinition());
        imagesGrid.ColumnDefinitions.Add(new ColumnDefinition());
        stkPnlImages.Children.Add(imagesGrid);


        for (int i = 0; i < mangaList.Count; i++)
        {
            imagesGrid.RowDefinitions.Add(new RowDefinition());

            Image image = new Image(); 
            image.Source = new BitmapImage(new Uri(@"Covers\" + mangaList[i].SourceImage, UriKind.Relative));
            image.Height = 200;
            image.Margin = new Thickness(20);

            SolidColorBrush grayBrush = new SolidColorBrush() { Color = Colors.White };
            Rectangle imageBackground = new Rectangle() { Height = image.Height + 20, Width = image.Width + 20, Fill = grayBrush };
            imageBackground.Margin = new Thickness(10);

            TextBlock mangaName = new TextBlock() { Text = mangaList[i].Name, FontSize = 10, FontFamily = new FontFamily("Century Gothic")};

            Grid.SetRow(imageBackground, i);
            Grid.SetColumn(imageBackground, 0);
            Grid.SetRow(image, i);
            Grid.SetColumn(image, 0);
            Grid.SetRow(mangaName, i);
            Grid.SetColumn(mangaName, 1);

            image.MouseLeftButtonDown += new MouseButtonEventHandler(this.Image_Click);
            imagesGrid.Children.Add(imageBackground);
            imagesGrid.Children.Add(image);
            imagesGrid.Children.Add(mangaName);

            imagesGrid.ColumnDefinitions[1].Loaded += new RoutedEventHandler( SetMargin(mangaName, imagesGrid) );
        }
    }

    void SetMargin(TextBlock txtBlkMangaName, Grid grdImages)
    {
        txtBlkMangaName.Margin = new Thickness(grdImages.ColumnDefinitions[1].ActualWidth / 2 - txtBlkMangaName.Width / 2, 0, 0, 0);
    }

person HyperPXLZ    schedule 07.02.2020    source источник


Ответы (1)


Как говорит ошибка, конструктор RoutedEventHandler ожидает имя метода с определенная подпись.

Что вы можете попробовать, так это добавить mangaName к свойству Tag объекта imagesGrid, а затем получить его в методе SetMargin. Кроме того, SetMargin должна иметь определенную подпись, чтобы работать как RoutedEventHandler.

Измените это:

imagesGrid.ColumnDefinitions[1].Loaded += new RoutedEventHandler( SetMargin(mangaName, imagesGrid) );

к этому:

imagesGrid.Tag = mangaName;
imagesGrid.ColumnDefinitions[1].Loaded += new RoutedEventHandler(SetMargin);

и это:

void SetMargin(TextBlock txtBlkMangaName, Grid grdImages)
{
    txtBlkMangaName.Margin = new Thickness(grdImages.ColumnDefinitions[1].ActualWidth / 2 - txtBlkMangaName.Width / 2, 0, 0, 0);
}

к этому:

void SetMargin(object sender, RoutedEventArgs e)
{
    var imagesGrid = sender as Grid;
    if( imagesGrid == null )
        return;

    var textBlock = imagesGrid.Tag as TextBlock;
    if( textBlock == null )
        return;

    textBlock.Margin = new Thickness(imagesGrid.ColumnDefinitions[1].ActualWidth / 2 - textBlock.Width / 2, 0, 0, 0);
}

Как вы видите, Grid на самом деле является отправителем этого события, поэтому вы можете легко получить его. Кроме того, вы можете получить ссылку на TextBlock, которую мы ранее сохранили в свойстве Tag. Оттуда вы просто продолжаете как обычно и можете изменять свойства каждого элемента.

person Timo Salomäki    schedule 07.02.2020
comment
В sender.Tag я получаю сообщение об ошибке 'object' не содержит определения для 'Tag'. - person HyperPXLZ; 09.02.2020
comment
Правильно, моя ошибка. Вам нужно получить свойство Tag переменной imagesGrid, которая уже приведена к Grid. Я исправил пример. - person Timo Salomäki; 09.02.2020
comment
Извините за поздний ответ, но нет, к сожалению, это не сработало. Все выглядит правильно, но Textblock по-прежнему не позиционируется так, как я хочу. В конце концов, это не так важно, просто подумал, что это будет выглядеть красиво. Спасибо за помощь. - person HyperPXLZ; 11.02.2020