MenuFlyout Windows Phone 8.1

0

Witam wszystkich serdecznie. Prosze o pomoc :) Napisałem taką o to funkcję:

private async void FlyoutButton_1_Loaded(object sender, RoutedEventArgs e)
        {
            var Loading = new File();
            var Content = await Loading.LoadLocal("ExercisesList.Se");
           
            var loaded = JsonConvert.DeserializeObject<IEnumerable<DataSource>>(Content);
            foreach (var item in loaded)
            {
                MenuFlyoutItem flyoutItem = new MenuFlyoutItem();
                flyoutItem.Text = item._Nazwa;
                menuFlyout_1.Items.Add(flyoutItem);
            }

Funkcja dodaje Listę ćwiczeń z pliku Json do MenuFlyout znajdującym się w przycisku.

<Button x:Name="FlyoutButton_1" HorizontalAlignment="Stretch" VerticalAlignment="Center" FontSize="14" Content="Cwiczenie" Margin="10,10,0,0" Height="40" Loaded="FlyoutButton_1_Loaded">
                        <Button.Flyout>
                            <MenuFlyout x:Name="menuFlyout_1"/>
                        </Button.Flyout>
                    </Button>

Otrzymuję listę trzech ćwiczeń. Teraz pytanie do was. Jak sprawdzić czy użytkownik wybrał (Click) ćwiczenie z listy jak nie mam dostępu do zdarzenia Click pozycji MenuFlyoutItem?

1

Z tego co widzę to masz zmienną flyoutItem, która właśnie jest typu MenuFlyoutItem, więc możesz do niej dodać handler na zdarzenie click:

flyoutItem.Click += (sender, e) => { ... }
0

Hmm. Przerobiłem kod według twoich uwag:

MenuFlyoutItem flyoutItem;

        public SeriePage()
        {
            this.InitializeComponent();

            this.flyoutItem.Click += (sender, e) => { this.FlyOut_1(); };
        }

private async void FlyoutButton_1_Loaded(object sender, RoutedEventArgs e)
        {
            var Loading = new File();
            var Content = await Loading.LoadLocal("ExercisesList.Se");

            if (Content == "0") { Content = "[]"; }
            if (Content == string.Empty) { Content = "[]"; }
            if (Content == null) { Content = "[]"; }

            var loaded = JsonConvert.DeserializeObject<IEnumerable<DataSource>>(Content);
            foreach (var item in loaded)
            {
                flyoutItem = new MenuFlyoutItem();
                flyoutItem.Text = item._Nazwa;                
                menuFlyout_1.Items.Add(flyoutItem);
            }        
public void FlyOut_1()
        {
            textBlock_1.Text = "Ok";
        }

Otrzymuje error: "Delegate to an instance method cannot have null 'this'."

Nie rozumiem co pominąłem. :/

0

No i doszedłem co i jak:

private async void FlyoutButton_1_Loaded(object sender, RoutedEventArgs e)
        {
            var Loading = new File();
            var Content = await Loading.LoadLocal("ExercisesList.Se");

            if (Content == "0") { Content = "[]"; }
            if (Content == string.Empty) { Content = "[]"; }
            if (Content == null) { Content = "[]"; }

            var loaded = JsonConvert.DeserializeObject<IEnumerable<DataSource>>(Content);
            foreach (var item in loaded)
            {

                flyoutItem = new MenuFlyoutItem();
                flyoutItem.Text = item._Nazwa;                
                menuFlyout_1.Items.Add(flyoutItem);

                flyoutItem.Click += new RoutedEventHandler(flyoutItem_Click);
            }           
        }
public void flyoutItem_Click(object sender, RoutedEventArgs e)
        {
            textBlock_1.Text = "Ok";
        }

Nie pomyślałem. Okazuje się że podpinałem zdarzenie pod nie istniejący obiekt. Najpierw należało stworzyć flyoutItem = new MenuFlyoutItem();
Następnie podpiąć pod to zdarzenie: flyoutItem.Click += new RoutedEventHandler(flyoutItem_Click);

Dziękuję serdecznie za pomoc :)

0

Witam ponownie. Mam jeszcze pytanie. Jak odwołać się do flyoutItem który został kliknięty?

private async void FlyoutButton_1_Loaded(object sender, RoutedEventArgs e)
        {
            var Loading = new File();
            var Content = await Loading.LoadLocal("ExercisesList.Se");

            if (Content == "0") { Content = "[]"; }
            if (Content == string.Empty) { Content = "[]"; }
            if (Content == null) { Content = "[]"; }

            var loaded = JsonConvert.DeserializeObject<IEnumerable<DataSource>>(Content);
            foreach (var item in loaded)
            {
                flyoutItem1 = new MenuFlyoutItem();
                flyoutItem1.Text = item._Nazwa;
                menuFlyout_1.Items.Add(flyoutItem1);
              
                flyoutItem1.Click += new RoutedEventHandler(flyoutItem1_Click);
            }           
        }
public void flyoutItem1_Click(object sender, RoutedEventArgs e)
        {
            var Clicked = flyoutItem1.Text;            
            FlyoutButton_1.Content = Clicked;
         }

title

Po kliknięciu na 1 zostaje wyświetlona 3 w FlyoutButton_1.Content.

W tym przypadku flyoutItem1.Text zostaje przypisany z ostatniego utworzonego obiektu a chciałbym aby został przypisany z klikniętego obiektu. Jak się do tego odwołać?

1

Spróbuj rzutować obiekt typu sender na MenuFlyoutItem w twoim "onClicku"

var menuFlyoutItem = sender as MenuFlyoutItem;
if(menuFlyoutItem == null) {
    return;
}
menuFlyoutItem ...

1

W zdarzeniach z GUI zmienna sender zawiera referencję do obiektu, na którym zdarzenie zostało wykonane. Musisz jednak rzutować je do odpowiedniego typu:

MenuFlyoutItem flyoutItem = sender as MenuFlyoutItem;
if (flyoutItem != null)
{
	flyoutItem.Text = "Test";
	...
}
0

Działa idealnie:

            MenuFlyoutItem flyoutItem = sender as MenuFlyoutItem;
            if (flyoutItem != null)
            {
                var Clicked = flyoutItem.Text;
                FlyoutButton_1.Content = Clicked;
            }

Serdeczne dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1