Лучший отвечающий
Обработать нажатие на элемент в StackPanel

Вопрос
-
Здравствуйте!
У меня есть небольшая проблема.
Имеется 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