locked
Обработать нажатие на элемент в StackPanel RRS feed

  • Вопрос

  • Здравствуйте!

    У меня есть небольшая проблема.

    Имеется Pivot с 6 Item. На каждом из 6 - по одной StackPanel.

    В панель я добавляю Grid`ы с определенной текстовой информацией.

    Как мне при нажатии на элемент StackPanel получить данные из этого элемента?

    22 декабря 2013 г. 9:13

Ответы

  • Во-первых, DataContext Вы должны задавать не из пустого (нового) объекта, а из входящего параметра:

    private Grid PutDataOnPivot(Lesson les)
    {
            // some code
    	grd.DataContext = les;
    	grd.Tap += grd_Tap;
    	return grd;			
    }	


    Во-вторых, в обработчике событий вам необходим достать DataContext данного Grid'а.

    void grd_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
    	Grid grid = (Grid)sender;
    	var dataContext = grid.DataContext as Lesson;			
    }

    Ну и далее все зависит от того, что вам необходимо делать с данным экземпляром класса Lesson.

    • Помечено в качестве ответа No_Comments 23 декабря 2013 г. 19:52
    23 декабря 2013 г. 18:53

Все ответы

  • Здравсвуйте, если можно - код пожалуйста.

    Используете ли вы MVVM?

    22 декабря 2013 г. 10:11
  • Да собственно и весь код:

    switch (lesson.Day)
    {
    case 1: monday.Children.Add(PutDataOnPivot(lesson)); break;
    case 2: tuesday.Children.Add(PutDataOnPivot(lesson)); break;
    case 3: wensday.Children.Add(PutDataOnPivot(lesson)); break;
    case 4: thursday.Children.Add(PutDataOnPivot(lesson)); break;
    case 5: friday.Children.Add(PutDataOnPivot(lesson)); break;
    case 6: saturday.Children.Add(PutDataOnPivot(lesson)); break;
    }

    где PutDataOnPivot() получает на вход объект моего класса, а на выходе выдает Grid.

    Нет, не использую.

    22 декабря 2013 г. 10:52
  • А воз XAML разметка

    <Grid x:Name="LayoutRoot" Background="Transparent">
            <!--Элемент управления Pivot-->
            <controls:Pivot x:Name="week" Title="МОЕ ПРИЛОЖЕНИЕ">
                <!--Первый элемент Pivot-->
                <controls:PivotItem Tag="1" Header="Пн">
                    <Grid Margin="0,0,0,0">
                        <StackPanel x:Name="monday" Tap="monday_Tap_1"/>
                    </Grid>
                </controls:PivotItem>
                <!-- и так далее-->
    </Grid>

    22 декабря 2013 г. 11:44
  • Grid'у, который вы создаете, присвойте экземпляр вашего класса как DataContext. Если хотите обработать клик на данный грид - подписываете на данное событие в коде при создании (для этого вам нужен будет только один обработчик)
    22 декабря 2013 г. 16:43
  • У меня тут сложная система добавления элементов на конечный грид:

    private Grid PutDataOnPivot(Lesson les)
    {
    	TextBlock sub = new TextBlock() { Text = les.Subject, FontSize = 30, TextWrapping = TextWrapping.Wrap };
    	TextBlock prof = new TextBlock() { Text = les.Professor, TextWrapping = TextWrapping.Wrap, FontSize = 25 };
    	TextBlock type = new TextBlock() { Text = les.Type, TextWrapping = TextWrapping.Wrap, FontSize = 25 };
    	TextBlock room = new TextBlock() { Text = les.Room, TextWrapping = TextWrapping.Wrap, FontSize = 25 };
    	Grid grd = new Grid() { Margin = new Thickness(0, 0, 0, 20), Height = 130 };
    	ColumnDefinition col0 = new ColumnDefinition();
    	ColumnDefinition col1 = new ColumnDefinition();
    	RowDefinition row1 = new RowDefinition();
    	RowDefinition row2 = new RowDefinition();
    	grd.ColumnDefinitions.Add(col0);
    	grd.ColumnDefinitions.Add(col1);
    	grd.RowDefinitions.Add(row1);
    	grd.RowDefinitions.Add(row2);
    	Grid.SetRow(sub, 0);
    	Grid.SetColumnSpan(sub, 2);
    	StackPanel st0 = new StackPanel();
    	st0.Children.Add(type);
    	st0.Children.Add(room);
    	Grid.SetColumn(st0, 0);
    	Grid.SetRow(st0, 1);
    	StackPanel st1 = new StackPanel();
    	st1.Children.Add(prof);
    	Grid.SetColumn(st1, 1);
    	Grid.SetRow(st1, 1);
    	grd.Children.Add(st0);
    	grd.Children.Add(st1);
    	grd.Children.Add(sub);
    	Lesson tmp = new Lesson();
    	grd.DataContext = tmp;
    	grd.Tap += grd_Tap;
    	return grd;			
    }	

    И вот 3 последние строчки - задаю DataContext, задаю обработчик события.

    В обработчике у меня:

    void grd_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
    	Grid grd = (Grid)sender;
    	throw new NotImplementedException();			
    }

    Меня на большее не хватило) 
    Я не понимаю, что делать с Grid`ом дальше?

    23 декабря 2013 г. 10:47
  • Во-первых, DataContext Вы должны задавать не из пустого (нового) объекта, а из входящего параметра:

    private Grid PutDataOnPivot(Lesson les)
    {
            // some code
    	grd.DataContext = les;
    	grd.Tap += grd_Tap;
    	return grd;			
    }	


    Во-вторых, в обработчике событий вам необходим достать DataContext данного Grid'а.

    void grd_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
    	Grid grid = (Grid)sender;
    	var dataContext = grid.DataContext as Lesson;			
    }

    Ну и далее все зависит от того, что вам необходимо делать с данным экземпляром класса Lesson.

    • Помечено в качестве ответа No_Comments 23 декабря 2013 г. 19:52
    23 декабря 2013 г. 18:53
  • Ой, спасибо Вам большое, очень Вы мне помогли!

    И небольшой вопрос в догонку. А вы не подскажете, как сделать анимацию при нажатии на элемент?

    23 декабря 2013 г. 19:53
  • Данное поведение необходимо обрабатывать в VisualState'ах. Т.е. вам необходимо переопределить стиль и дописать анимацию в определенный visualState.
    • Предложено в качестве ответа Mykyta Bondarenko 26 декабря 2013 г. 7:58
    26 декабря 2013 г. 7:58