locked
Event Handler in Style RRS feed

  • Вопрос

  • Я правильно понимаю, что в стиле нельзя задать EventHandler? Есть ли какой-то способ декларативно задавать общие обработчики событий для пары десятков идентичных элементов? Если нет, то есть способ лучше, чем foreach по всем элементам ?
    17 апреля 2013 г. 17:34

Ответы

  • <Grid UIElement.Tapped="tap_handler">
    • Изменено Kirill Bessonov 18 апреля 2013 г. 13:49
    • Помечено в качестве ответа K_K 18 апреля 2013 г. 14:00
    18 апреля 2013 г. 13:48

Все ответы

  • Если вам нужно обрабатывать перенаправленные события, то в родительском элементе управления вы можете добавить обработчик для определенного типа событий (Для более подробное описание можно почитать здесь в разделе 5).

    Пример добавления обработчика маршрутизируемого события.

    Это общие понятия. Если у вас все же возникают проблемы - покажите свой код, попробуем решить.

    17 апреля 2013 г. 18:15
  • код простой - N-ое количество ToggleButton'ов, пусть будет 50. 

    у каждой кнопки нужно обрабатывать Checked и Unchecked.

    вопрос - как можно избежать прописывания обработчиков для каждой кнопки и написать один раз для всех?

    и, конечно, не имеет большого значения, что в данном случае это button, это может быть хоть UC, не важно.

    17 апреля 2013 г. 21:09
  • собственно первое, что приходит на ум (после безуспешных попыток сделать это в XAML) 

    	foreach (ToggleButton x in grid_Buttons.Children)
                {
                    x.Checked += ToggleButton_Checked;
                    x.Unchecked += ToggleButton_Unchecked;
                }

    но я понятия не имею, на сколько ресурсоемкий этот код.

    17 апреля 2013 г. 21:15
  • Можно попробовать так:

            <StackPanel x:Name="stackPanel" UIElement.Tapped="DoSomething">
                <Button Content="Button 1"/>
                <Button Content="Button 2"/>
                <Button Content="Button 3"/>
            </StackPanel>
    

        ...
        private void DoSomething(object sender, RoutedEventArgs e)
        {
            var target = e.OriginalSource as DependencyObject;
            if(target == null) return;
            var parent = Finder<Button>.FindAncestor(target);
            if(parent != null) Debug.WriteLine(parent.Content.ToString());
        }
    
    ...
    
        class Finder<T> where T : class
        {
            public static T FindAncestor(DependencyObject dependencyObject)
            {
                var parent = VisualTreeHelper.GetParent(dependencyObject);
                if (parent == null) return null;
                var parentT = parent as T;
                return parentT ?? FindAncestor(parent);
            } 
        }
    

    При этом для каждой кнопки (а точнее события Tapped) будет выполняться метод DoSomething.

    • Помечено в качестве ответа K_K 18 апреля 2013 г. 7:36
    • Снята пометка об ответе K_K 18 апреля 2013 г. 13:00
    17 апреля 2013 г. 22:45
  • спасибо, должно сработать) только не понял, зачем parent, ведь в target уже есть то, что мне нужно.
    18 апреля 2013 г. 7:36
  • В данном варианте target не обязательно Button, там тот элемент по которому tapp'нули.
    18 апреля 2013 г. 8:03
  • А вы этот код пробовали на WinRT? У меня работает на WPF, но не на WinRT
    18 апреля 2013 г. 13:01
  • Я его там и тестировал. А что именно  не работает?
    18 апреля 2013 г. 13:10
  • "The attached property 'Tapped' was not found in type 'ToggleButton' "

    <Grid ToggleButton.Tapped="tap_handler">
     <ToggleButton Style={...} ... />
     <ToggleButton Style={...} ... />
    <Grid>


    18 апреля 2013 г. 13:41
  • <Grid UIElement.Tapped="tap_handler">
    • Изменено Kirill Bessonov 18 апреля 2013 г. 13:49
    • Помечено в качестве ответа K_K 18 апреля 2013 г. 14:00
    18 апреля 2013 г. 13:48
  • Хорошо, работает... но, блин, через class Finder<T> ))

    не самый декларативный подход) все равно спасибо, попробую по-вашему.



    • Изменено K_K 18 апреля 2013 г. 14:00
    18 апреля 2013 г. 14:00
  • Вы в принципе можете использовать и свой вариант, ничего плохого в нем нет (единственное - не забудьте отписаться от событий).
    18 апреля 2013 г. 14:18