пятница, 20 ноября 2015 г.

Как я отвечаю на вопросы

Эта публикация из серии ответы на вопросы с MSDN. Вот только на вопрос я уже ответил, но вот в топике был задан вопрос: "А как вы даете ответы?". Вопрос переформулирован мной, по ссылке он в полном виде можно сходить и посмотреть. Под катом я расскажу как я отвечал конкретно на оригинальный вопрос из топика и вообще как я действую столкнувшись с интересной проблемой.


Поехали.
Проблема была в том, что есть Rectangle. К нему применено несколько трансформаций. Одна из трансформаций RotateTransform на некоторый угол. Как, например, при попадании мышки на Rectangle узнать угол поворота. Вот так выглядел вопрос (картинка кликабельна):
Т.к. из текста вопроса проблема не понятна, то создал пустой проект, скопировал в него XAML и код чтобы посмотреть что происходит. У меня монитор меньше 21000 пикселей, поэтому прямоугольник после запуска приложения я не увидел. Пришлось менять размеры и положение.
Когда же прямоугольник стал виден, то добавил в метод точку останова:
Навел мышку, начал отладку по шагам и увидел, что RenderTransform содержит экземпляр класса TransformGroup и, само собой, при приведении к типу RotateTransform будет null:
Дальше все просто. Посмотрел, что свойство RenderTransform типа Transform, а у него нет ни Items, ни Children. Смотрел просто, донаборщиком:

Ну а раз нет, то значит придется явно приводить к типу TransformGroup. У которого есть свойство Children.
Дальше все просто, по XAML видно, что в Children есть три трансформации, т.к. нам нужна трансформация известного типа, то применяем из Linq метод OfType (пользуюсь им достаточно часто, поэтому даже сомнений не было что здесь использовать). Ну а дальше все просто. По конкретному примеру все.

В общем случае, когда хочу что-то сделать, то уже сразу, исходя из предыдущего опыта, есть несколько идей как это сделать. Дальше смотрю какие есть методы, классы что-то через MSDN, что-то просто в донаборщике иногда переходя по F12 к сигнатуре. Отладчик очень часто подсказывает где какой тип, тоже можно воспользоваться. Ну а если все равно не получается или выскакивает какая-нибудь заковыристая ошибка, то ищу поисковиками. Очень часто решение находится на MSDN, Stackoverflow или в блогах. Ответ в большинстве случаев будет на английском, поэтому решив проблему, бывает, пишу статью в этот бложик, вдруг кому пригодится. Совсем редко бывают ситуации когда все уперся, не могу ничего путного найти/придумать. Ок, тогда пытаюсь реализовать другой способ решения. В описанной выше задаче, это могло быть хранение углов трансформации во ViewModel или Model с прокидыванием во View через Binding. При этом подходе с визуальными компонентами вообще дела можно не иметь, т.к. все значения у меня уже доступны бизнес-логике приложения.

4 комментария:

  1. Пожалуйста. Надеюсь было полезно.

    ОтветитьУдалить
  2. Добрый вечер или ночь, решил написать в вашем блоге может вы поможете в каком направлении двигаться , программирую микроконтроллеры , с выходом win 10 core iot решил на Raspberry установить , и использовать UWP , информации еще достаточно мало в инете , и самое основное с чем есть проблема это с Тачскрином , да мышка работает и клавиатура тоже , но с тачскрином проблема , есть написанный класс для тачскрина и в нем реализовано 3 события down,moved,up и они срабатывают когда прикасаешься или водишь по экрану и можно получить от них только координаты на экране , на сегодняшний день получилось нажимать на кнопки , чекбоксы , двигать скролы с помощью метода var elements = VisualTreeHelper.FindElementsInHostCoordinates(new Point(screenPosition.X, screenPosition.Y), Window.Current.Content,false);
    peer=FrameworkElementAutomationPeer.FromElement(element);
    и потом к провайдерам IScrollProvider,IToggleProvider, итд
    , но вот уже мучаюсь неделю и неполучается например реализовать выделение и выбор в выпадающем списке Combobox открывать его и закрывать могу а вот выбрать нет, Даже уже пошел другим путем и пробовал так что при касании к экрану перемещать туда стрелку мышки и потом вызывать метод клик , перемещать получается но вот с вызовом события клик мышки, есть проблемы )) хоть стрелка и переместилась в другой угол экрана а при запросе ее координаты остаются прежние , может подскажите что делать ? , экранов и тачскринов много разных для микропк а вот драйверов то на них нет в win10 iot

    ОтветитьУдалить
  3. Лучший вариант бы был наверное с перемещением стрелки и вызовом клик , если это вообще возможно , думаю проблема встанет с sender

    ОтветитьУдалить
  4. https://www.hackster.io/dotMorten/windowsiottouch-44af19
    скину ссылку еще на всякий случай там есть этот класс для тачскрина

    ОтветитьУдалить