UWP C # System.InvalidCastException - PullRequest
       36

UWP C # System.InvalidCastException

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

Ранее я уже спрашивал о том, как динамически добавлять кнопки .Теперь я добавил дополнительные image рядом с button, чтобы указать статус соединения клиента (ов) .У меня есть 2 buttons один к добавить и другой к удалить button и image.После нажатия будет menuflyout, чтобы выбрать соответствующую кнопку для удаления.Моя проблема в том, что мне удается добавить статус image, но когда приходит нажатие на delete button, menuflyout сталкивается с exception, который говорит System.InvalidCastException.

Мой код следующим образом;пожалуйста помоги.Спасибо.

public Uri connectedUri = new Uri("ms-appx:///Assets/icon-connected.png");
public Uri disconnectedUri = new Uri("ms-appx:///Assets/icon-disconnected.png");

private void AddMenuFlyoutItem_Click(object sender, RoutedEventArgs e)
{
    var item = sender as MenuFlyoutItem;
    var deviceName = item.Text;
    var deviceIP = item.Tag;

    Button b = new Button();
    b.Height = 30;
    b.Width = 100;
    b.VerticalAlignment = VerticalAlignment.Top;
    b.HorizontalAlignment = HorizontalAlignment.Left;
    b.Margin = new Thickness(20, 20, 0, 0);
    b.Content = deviceName;   // "Button " + buttonCounter;
    b.Tag = deviceIP;
    b.Click += AddMenuButton_Click;


    Image stsImg = new Image();
    BitmapImage bitmapImage = new BitmapImage();
    //Uri connectedUri = new Uri("ms-appx:///Assets/icon-connected");
    //Uri disconnectedUri = new Uri("ms-appx:///Assets/icon-disconnected");
    bitmapImage.UriSource = connectedUri;
    stsImg.Source = bitmapImage;
    stsImg.Width = 20;
    stsImg.Height = 20;
    stsImg.VerticalAlignment = VerticalAlignment.Top;
    stsImg.HorizontalAlignment = HorizontalAlignment.Left;
    stsImg.Margin = new Thickness(130, 20, 0, 0);
    stsImg.Name = deviceName;
    stsImg.Tag = deviceIP;

    //Calculate the place of the button
    int column = (int)(buttonCounter / 4);
    int row = buttonCounter % 4;

    //Check if you need to add a columns
    if (row == 0)
    {
        ColumnDefinition col = new ColumnDefinition();
        col.Width = new GridLength(column, GridUnitType.Auto);
        myGrid.ColumnDefinitions.Add(col);
    }

    //Add the button
    myGrid.Children.Add(b);
    Grid.SetColumn(b, column);
    Grid.SetRow(b, row);

    myGrid.Children.Add(stsImg);
    Grid.SetColumn(stsImg, column);
    Grid.SetRow(stsImg, row);
    buttonCounter++;
}

private void RemoveButton_Click(object sender, RoutedEventArgs e)
{
    var menuFlyout = new MenuFlyout();

    try
    {
        foreach (Button btn in myGrid.Children)
        {
            var row = Grid.GetRow(btn);
            var col = Grid.GetColumn(btn);
            //ButtonRow.Add(btn.Content.ToString(), row.ToString());
            //ButtonCol.Add(btn.Content.ToString(), col.ToString());
            var menuFlyoutItem = new MenuFlyoutItem() { Name = btn.Tag.ToString(), Text = btn.Content.ToString() };
            menuFlyoutItem.Tag = btn.Content.ToString();
            menuFlyoutItem.Click += RemoveMenuFlyoutItem_Click;
            menuFlyout.Items.Add(menuFlyoutItem);
        }
        RemoveButton.Flyout = menuFlyout;
    }
    catch (Exception)
    {

    }
}

Ответы [ 2 ]

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

Все ли дети от myGrid, от типа Button?

 foreach (Button btn in myGrid.Children)

Нет, потому что myGrid.Children.Add(stsImg);

Когда вы пытаетесь получить stsImg как Button, у вас есть это исключение, потому что stsImg не относится к типу Button.

Вам нужно отфильтровать только кнопки.

foreach (Button btn in myGrid.Children.OfType<Button>()){
// do stuff
}
0 голосов
/ 18 октября 2018

Проблема в foreach:

foreach (Button btn in myGrid.Children)

Когда написано так, он пытается привести всех потомков от Grid к Button.Это невозможно, потому что некоторые дети не являются кнопками.Однако вы можете написать цикл следующим образом:

foreach (Button btn in myGrid.Children.OfType<Button>())

Метод расширения OfType<T> LINQ будет фильтровать входные данные, перечисляемые только для тех элементов, которые относятся к данному типу.

...