###前提・実現したいこと
ScrollViewer内のComboboxでドロップダウンリストが表示されている状態で
ScrollViewer内Comboboxの外領域をスワイプすると
ドロップダウンリストが消えずに表示ままになった状態でスクロールしてしまいます。
マウスホイールではドロップダウンリストが表示されているときは
スクロールすることができませんでした。
スワイプでも同様にスクロールできないようにするか
ドロップダウンリストが消えてほしいのですが、
設定または回避策があればご教授いただけますでしょうか?
###補足情報(言語/FW/ツール等のバージョンなど)
Windows10 Pro(x64)
.NetFramework 4.6.1(VB)
確認した端末:Surface4Pro
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
twyujiro15様のアドバイスをもとに再度ビヘイビアを検討してみました。
ComboBoxから親ScrollViewerを検索して、
TouchDownイベントをハンドリングするようにしています。
ハンドリングするタイミングはDropDownOpendイベントとしています。
VB
1 Public Class CloseDropDownBehavior 2 Inherits Behavior(Of ComboBox) 3 4 Private _ScrollViewer As ScrollViewer 5 6 Protected Overrides Sub OnAttached() 7 MyBase.OnAttached() 8 AddHandler AssociatedObject.Loaded, AddressOf AssociatedObject_Loaded 9 AddHandler AssociatedObject.TouchDown, AddressOf AssociatedObject_TouchDown 10 AddHandler AssociatedObject.DropDownOpened, AddressOf AssociatedObject_DropDownOpened 11 AddHandler AssociatedObject.DropDownClosed, AddressOf AssociatedObject_DropDownClosed 12 End Sub 13 14 Protected Overrides Sub OnDetaching() 15 MyBase.OnDetaching() 16 RemoveHandler AssociatedObject.Loaded, AddressOf AssociatedObject_Loaded 17 RemoveHandler AssociatedObject.TouchDown, AddressOf AssociatedObject_TouchDown 18 RemoveHandler AssociatedObject.DropDownOpened, AddressOf AssociatedObject_DropDownOpened 19 RemoveHandler AssociatedObject.DropDownClosed, AddressOf AssociatedObject_DropDownClosed 20 AssociatedObject_DropDownClosed(_ScrollViewer, New EventArgs) 21 End Sub 22 23 Private Sub AssociatedObject_Loaded(sender As Object, e As RoutedEventArgs) 24 _ScrollViewer = AssociatedObject. 25 Parents(Of ScrollViewer). 26 Where(Function(x) x.PanningMode <> PanningMode.None). 27 FirstOrDefault 28 End Sub 29 30 Private Sub AssociatedObject_TouchDown(sender As Object, e As TouchEventArgs) 31 'ComboBoxタッチ時はScrollViewerのタッチを抑制 32 'これをしないとコンボボックスDropDown後の再タッチでDropDownを閉じることができない 33 e.Handled = True 34 End Sub 35 36 Private Sub AssociatedObject_DropDownOpened(sender As Object, e As EventArgs) 37 If _ScrollViewer Is Nothing Then Return 38 AddHandler _ScrollViewer.TouchDown, AddressOf ScrollViewer_TouchDown 39 End Sub 40 41 Private Sub AssociatedObject_DropDownClosed(sender As Object, e As EventArgs) 42 If _ScrollViewer Is Nothing Then Return 43 RemoveHandler _ScrollViewer.TouchDown, AddressOf ScrollViewer_TouchDown 44 End Sub 45 46 Private Sub ScrollViewer_TouchDown(sender As Object, e As RoutedEventArgs) 47 AssociatedObject.IsDropDownOpen = False 48 End Sub 49 End Class
※Parentsメソッドは親エレメントを取得するための拡張メソッドです。
投稿2017/01/30 04:02
編集2017/01/30 06:17総合スコア159
0
twyujiro15さんのアドバイスに従って、IsDropDownOpenをFalseにするようにしたビヘイビアを作成しました。
ただ、ScrollViewer内のすべてのエレメントからComboBoxの検索が必要であることと
そのタイミングがScrollChangedイベントに頼ってしまうため、パフォーマンスが悪いかもしれません。
一応、フラグを設けて無駄なエレメントの検索は回避するようにしています。
VB
1 Public Class CloseDropDownBehavior 2 Inherits Behavior(Of ScrollViewer) 3 4 Private _IsCanCloseDropDow As Boolean 5 6 Protected Overrides Sub OnAttached() 7 MyBase.OnAttached() 8 AddHandler AssociatedObject.ManipulationStarted, AddressOf AssociatedObject_ManipulationStarted 9 AddHandler AssociatedObject.ScrollChanged, AddressOf AssociatedObject_ScrollChanged 10 End Sub 11 12 Protected Overrides Sub OnDetaching() 13 MyBase.OnDetaching() 14 RemoveHandler AssociatedObject.ManipulationStarted, AddressOf AssociatedObject_ManipulationStarted 15 RemoveHandler AssociatedObject.ScrollChanged, AddressOf AssociatedObject_ScrollChanged 16 End Sub 17 18 Private Sub AssociatedObject_ManipulationStarted(sender As Object, e As ManipulationStartedEventArgs) 19 _IsCanCloseDropDow = True 20 End Sub 21 22 Private Sub AssociatedObject_ScrollChanged(sender As Object, e As ScrollChangedEventArgs) 23 If _IsCanCloseDropDow Then 24 _IsCanCloseDropDow = False 25 Dim combobox = AssociatedObject.Descendants(Of ComboBox).Where(Function(x) x.IsDropDownOpen = True).FirstOrDefault 26 If combobox IsNot Nothing Then 27 combobox.IsDropDownOpen = False 28 End If 29 End If 30 End Sub 31 32 End Class
※Descendantsメソッドは孫エレメントを取得するための拡張メソッドです。
投稿2017/01/27 07:48
総合スコア159
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ベストアンサー
ScrollViewer 内 ComboBox の外領域をタッチした瞬間に、
ComboBox の IsDropDownOpen プロパティを false にしてはどうでしょうか。
投稿2017/01/26 23:27
総合スコア217
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/01 10:52
2017/02/02 05:27