2012-03-21 2 views
2

Мы работаем над приложением в течение последних нескольких месяцев, которое предназначено для ПК с Windows 7. Поэтому мы использовали SDK Surface 2 для большинства элементов управления, и все это приятно.Есть ли контроль поверхности в Surface 2?

Я недавно заметил, что один из наших пользовательских элементов управления не работает должным образом. Этот элемент управления предоставляет всплывающие меню, и это достигается с помощью элемента управления Popup. На ноутбуке разработчика это прекрасно работает, и меню исчезают, когда вы нажимаете на них. Я заметил, однако, что на нашем тестовом планшете у них есть тенденция оставаться открытой.

Я обнаружил, что в первом Surface SDK был SurfacePopup, но я не могу найти его в SDK поверхности. Они избавились от этого? Есть ли подход «лучшей практики»?

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

Кроме того, я заметил, что иногда SurfaceScrollViewer внутри всплывающих окон не работает. Я предполагаю, что это происходит потому, что он не правильно подбирает события касания. Я попытался добавить этот метод расширения к окну ..

this.EnableSurfaceInput(); 

..но я получаю NullReferenceException на System.Windows.Input.Mouse.get_LeftButton() который причудливо предполагает, что он может включить только поверхностные входы для управления, когда есть мышь подключена.

Есть идеи? Их всех будут приветствовать с распростертыми объятиями!

+0

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

+0

На самом деле, да. Я добавлю ответ, чтобы каждый мог его увидеть. –

ответ

0

В интересах Даниила и любого другого, кто нуждается в решении этого вопроса, я попытаюсь вернуть свой разум на два года и объяснить, как мы это работаем.

Насколько я помню, ответ заключался в том, чтобы использовать слой adorner вместо всплывающего окна. В принципе, каждый элемент управления WPF имеет слой adorner, который находится над стекю пользовательского интерфейса элемента управления. По умолчанию он ничего не содержит, но вы можете добавить все, что вам нравится.

Я получил все это, написав настраиваемый элемент управления, который позволяет размещать этот элемент управления с содержимым в XAML, а затем показывать и скрывать его, когда вам нужно. Когда это показано, оно перемещает свое содержимое в слой adorner содержащего окна, а когда оно скрыто, оно перемещает содержимое обратно в сам элемент управления, который скрыт от пользователя.

Боясь, я не могу вдаваться в подробности, но, насколько я помню, это было окончательное решение; заменяя всплывающие окна (которые никогда не работали очень хорошо) с настраиваемым элементом управления, который использует слой adorner.

Надеюсь, что это поможет!

+0

Я думаю, что ваше решение не сработало бы для нас, поскольку мы пытались заставить GridView Telerik работать, для чего требуется всплывающее окно для фильтра, но, к счастью, я нашел другое решение (см. Другой ответ). Но все же спасибо за обмен! Теперь у кого-то другого, страдающего от этой проблемы, есть две возможности. :) –

0

В Surface SDK 2.0 нет SurfacePopup, однако вы можете использовать обычное всплывающее окно WPF. Затем вам нужно, чтобы убедиться, что он получает сенсорные события с помощью метода расширения вы предложили выше во всплывающем окне, а не в окно:

((HwndSource)HwndSource.FromVisual(popup)).EnableSurfaceInput();

Edit: Как я только что узнал, это работает только когда всплывающее окно изначально открыто. Чтобы заставить его работать, когда всплывающее окно открывается позже, вам не нужно использовать всплывающее окно, но родительский элемент его дочернего элемента (см. this question).