Событие, загруженное в столбец, для установки поля дочерних элементов - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь динамически установить поле для текстового блока, чтобы оно помещалось в центр его родительского столбца после загрузки указанного столбца, но я получаю сообщение об ошибке Ожидаемое имя метода когда я вызываю мой метод 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);
    }

1 Ответ

0 голосов
/ 07 февраля 2020

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

. Вы можете попробовать добавить mangaName к свойству Tag imagesGrid, а затем получить его в методе SetMargin. Кроме того, SetMargin должен иметь указанную c подпись, чтобы он работал как 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 ранее. Оттуда вы просто продолжаете как обычно и можете изменять свойства для каждого элемента.

...