最近UWPコミュニティツールキットが見つかりました。私は今、MasterDetailView
を使用しています。私が必要とするものにはほぼ完璧ですが、重要なことはひとつ欠落しています。内部の「ListView」にアクセスすることはできません。MasterDetailView UWP - ListViewにアクセスする(またはスクロールさせる)
私のアプリケーションでは、前と後の2つのボタンがあり、それらを押すとリスト内を前後に進むだけです。
public void GoForward()
{
if (MasterDetailView.Items.Count > 0)
{
bool isNextGood = false;
MyItem selectedItem = MasterDetailView.Items[MasterDetailView.Items.Count - 1] as MyItem;
foreach (var v in MasterDetailView.Items)
{
if (isNextGood)
{
selectedItem = v as MyItem;
break;
}
if (v == MasterDetailView.SelectedItem)
isNextGood = true;
}
MasterDetailView.SelectedItem = selectedItem;
}
}
この私が「SelectedIndexを」にアクセスすることはできませんし、私が唯一のSelectedItem盛を持っているという理由だけで私はこのようにやって前/次の要素にアクセスするためのトリックを発見しました。さて、明らかにすべてのアイテムを同時に見ることができるわけではないので、MasterDetailViewはスクロールバーを備えた外側のListViewを提供します。 my next/prevボタンを押すと、SelectedItemは変更されますが、選択された要素でスクロールしません。選択は前進/後退しますが、リストはロックされます。リストのどこかで選択を失ったため、これは非常に否定的なフィードバックを生成し、それを検索しなければなりません。
どうすれば解決できますか?私はこのアプローチを試してみます:
1)MasterDetailViewのスタイルを探します。内部ではListViewStyleが見つかったので、単純な「SelectionChanged」イベントを内部に入れてApp.xaml.cs.で処理しようとしました。
<ListView x:Name="MasterList"
Grid.Row="1"
IsTabStop="False"
ItemContainerStyle="{TemplateBinding ItemContainerStyle}"
ItemTemplate="{TemplateBinding ItemTemplate}"
ItemTemplateSelector="{TemplateBinding ItemTemplateSelector}"
ItemsSource="{TemplateBinding ItemsSource}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
SelectionChanged="MasterList_SelectionChanged"/>
CS:
private void MasterList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListView list = sender as ListView;
list.ScrollIntoView(list.SelectedItem);
}
しかし、 "イベントはApplicationクラスのXAMLファイルで設定することができない"、言ったように。
2)のSelectedItemの親を取って考えてみて:私は、親へのアクセスが、のSelectedItemは決してのListViewItemであるように思わないよう、それは、最初の変換で失敗した、のListViewItemでのSelectedItemを変換しようとしたが、それはです「MyItem」タイプのこのように、私は親にアクセスすることはできません。
private void MasterDetailView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var item = MasterDetailView.SelectedItem as ListViewItem;
var parent = item.Parent;
var list = parent as ListView;
}
そして私はここにいる...私は別のコントロールに渡すMasterDetailViewですべての私の仕事を捨てたくありません。リストにアクセスする簡単な方法はありますか?または選択を変更しているときにリストをスクロールするだけですか?このような一つのこと、行うにはちょうどたい:選択が変更されたとき
private void List_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListView list = sender as ListView;
list.ScrollIntoView(list.SelectedItem);
}
は単に選択にスクロールが発生しましたが、私は単純なリストビューが、MasterDetailViewコントロールを持っていません。たとえそれがXAMLで完全に行われたとしても、私にとって最も重要なことは、このリストを作ることです!
ありがとうございました。
ソリューション
この方法は素晴らしいです。ちょうどコピーペースト。
public static T FindChildOfType<T>(DependencyObject root) where T : class
{
var queue = new Queue<DependencyObject>();
queue.Enqueue(root);
while (queue.Count > 0)
{
DependencyObject current = queue.Dequeue();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(current); i++)
{
var child = VisualTreeHelper.GetChild(current, i);
var typedChild = child as T;
if (typedChild != null)
{
return typedChild;
}
queue.Enqueue(child);
}
}
return null;
}
次に、リストを取得してスクロールさせるだけです。はいベイビー!
「MasterDerailView」は、クラスではなく要素のx:Nameです。
'MasterDetailsView'は、デフォルトとして' SelectionChanged'イベントがあります。 ' ' –
Viajy Nirmal:はい、そうです。しかし、使用するのに特別なことはありません。いつものように、SelectedItem(MyItemオブジェクト)とMyオブジェクトのListは検索できますが、ListViewやScrollingEventsは検索できません。それは役に立たない。このイベントを使ってリストを検索することはできません。私はその存在を知っていますが、スクロールを制御するためにリスト自身にアクセスすることはできません – Martinocom