質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

3回答

6017閲覧

WPF ScrollViewer内のComboboxでドロップダウンリストが表示されている状態でスワイプするとドロップダウンリストが消えずにスクロールしてしまう

mikupedia

総合スコア159

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2017/01/26 10:53

編集2017/01/27 05:41

###前提・実現したいこと
ScrollViewer内のComboboxでドロップダウンリストが表示されている状態で
ScrollViewer内Comboboxの外領域をスワイプすると
ドロップダウンリストが消えずに表示ままになった状態でスクロールしてしまいます。

マウスホイールではドロップダウンリストが表示されているときは
スクロールすることができませんでした。

スワイプでも同様にスクロールできないようにするか
ドロップダウンリストが消えてほしいのですが、
設定または回避策があればご教授いただけますでしょうか?

###補足情報(言語/FW/ツール等のバージョンなど)
Windows10 Pro(x64)
.NetFramework 4.6.1(VB)
確認した端末:Surface4Pro

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
mikupedia

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

twyujiro15

2017/02/01 10:52

今回は ScrollViewer が親要素ですが、そうとも限らないので、 CloseDropDownBehavior クラスに IsParent 添付プロパティを定義して、 親パネルとなる要素に CloseDropDownBehavior.IsParent="True" を設定するようにするといいかもしれませんね。 そうすれば親パネルを探索するとき、 単純に親要素を辿っていって IsParent が true の Panel を探すだけになります。
mikupedia

2017/02/02 05:27

twyujiro15 様 アドバイスありがとうございます。 >今回は ScrollViewer が親要素ですが、そうとも限らないので ScrollViewerのスワイプでドロップダウンが閉じられなかったため、ScrollViewer限定としました。 それ以外のパターンが今のところ思いつかないので添付プロパティとしなくてもよいかなと思っています。必要になったら対応したいと思います。 また、ソースコードでアタッチ時にTouchDown、DropDownOpened、DropDownClosedをハンドリングするように設定していますが、ご指摘通りそもそも親にScrollViewerがいない可能性もあるためハンドリングの設定はScrollViewerが存在していたらとしたほうが良いかもしれませんね。
guest

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

mikupedia

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

twyujiro15

2017/01/27 08:24

逆の発想で ComboBox にビヘイビアを付けるようにしては? 親要素のパネルのインスタンスを取得して、 そのパネルがタッチされたら自分の IsDropDownOpen を false にすればいいんですよ。
guest

0

ベストアンサー

ScrollViewer 内 ComboBox の外領域をタッチした瞬間に、
ComboBox の IsDropDownOpen プロパティを false にしてはどうでしょうか。

投稿2017/01/26 23:27

twyujiro15

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問