listview in listview

ListView(A)のEntryWidgetに、

ListView(B)を持ったWidgetクラスを設定して

AddItemしています。

マウス操作で、​

ListView(A)のOnClicked,OnHovered,OnSelectionChangedは呼ばれるのですが、

ListVIew(B)はすべての操作が受け付けません。

WidgetReflectorで見てみたところ​、ListView(A)が操作を吸収していて、

ListVIew(B)まで操作が届いてなさそうでした。

ListView(A)は選択アイテムの変更のため、クリックやホバーの通知を取る必要があり、

ListView(B)は選択中のアイテムの情報を変更するため、クリックやホバーの誘致を取る必要があります。

ListViewA,Bどちらもマウスで反応するようにする手段はありましたでしょうか?​

再現手順

お世話になっております。

ListView(A)のEntryWidgetの中にListView(B)を入れると、親のListViewがマウス入力を吸収してしまって、子のListView(B)までイベントが届かないことがあります。これはSlateやUMGの入力処理の仕組み上、親がクリックやホバーのイベントを「処理済み」にしてしまうためです。

まず試してほしいのは、ListView(B)のIsFocusableをtrueにして、必要があれば親側のEntryWidgetはfalseにすることです。あと、ListView(B)をクリックしたときにSetUserFocusを呼んで、明示的にフォーカスを子に移すのも効果があります。

次に、親のEntryWidgetでマウスイベントを全部処理しないようにしてみてください。OnMouseButtonDownやOnPreviewMouseButtonDownをオーバーライドして、子ListView上をクリックしたときはFReply::Unhandled()を返すようにすると、イベントがちゃんと子に届きます。必要に応じて、FReply::Handled().ReleaseMouseCapture()でキャプチャを解除するのもありです。

それと、透明なBorderやOverlayがクリックを邪魔してるケースもあるので、その部分をHitTestInvisibleにしてみてください。WidgetReflectorを使ってどのウィジェットがイベントを取っているか確認したり、OnMouseButtonDownでログを出してみるのもおすすめです。

基本的には、親と子のどっちも同じイベントを奪い合わないようにするのがポイントです。親が全部の入力を処理しちゃうと子まで届かないので、必要な部分だけHandledにして、あとはUnhandledで流す感じで調整してみてください。そうすればListView(A)とListView(B)の両方がちゃんとマウスに反応するようになると思います。

お手数ですが、よろしくお願いします。