WinRTのListViewでこの動作が発生しました。
LayoutUpdated
ScrollViewer
内部のイベントにイベントハンドラーがアタッチされていない場合、イベントの発生頻度は低くなりLayoutUpdated
ます。
下部近くのクリティカルラインを。でマークしました// === Critical line ===
。先頭のスラッシュを削除するlv_LayoutUpdated
と、より頻繁に呼び出されるようになります。
イベントが発生することはめったにないため、これは意味があります(コメントアウトされた場合)。問題は、ScrollViewer
'のミューテーションが終了する前にスクロール位置を設定できないことです。ただし、のイベントをルーティングするのScrollViewer
はばかげているようです。
これはバグですか、それともバブリング戦略やsthで説明できますか?
編集:ところで、このページはアプリのルートフレームには表示されませんが、違いが生じる場合は別のページのフレームに表示されます。
EDIT2:発火のタイミングが役に立たなかった理由を明らかにすることになりました(標準のイベントタイミングを台無しにしたデータバインディング非同期を実行していました)。ただし、動作は持続します。ScrollViewer
イベントをサブスクライブすると、イベントによる公開が増えListView
ます。どのような追加の状況下でこれが起こるのか、私にはわかりません。私はCaliburn.Microを使用しているので、おそらく彼らのデータソースの配線は制御に何かをします。たとえば、CMの問題の1つは、ビューの最初のLayoutUpdatedイベントを飲み込むことです(Message:Attachを介してバインドされている場合)。ただし、これはビューモデルにのみ影響する可能性があります。
とにかく、私はこの質問を他の人が解散するために残しておきます。
コードビハインドでのこの設定:
public FileListView()
{
this.InitializeComponent();
var lv = (ListView)FindName("Files");
lv.Loaded += lv_Loaded;
lv.LayoutUpdated += lv_LayoutUpdated;
}
void lv_LayoutUpdated(object sender, object e)
{
var m = (FileListViewModel)DataContext;
m.Offset = 100;
}
void lv_Loaded(object sender, RoutedEventArgs e)
{
var lv = (ListView)sender;
var sv = lv.GetFirstDescendantOfType<ScrollViewer>();
if (sv == null)
{
return;
}
//sv.LayoutUpdated += sv_LayoutUpdated; // === Critical line ===
}
void sv_LayoutUpdated(object sender, object e)
{
// No code here. Just the subscription suffices
}
XAML:
<Page
x:Class="Namespace1.FileListView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Poolar.Mobile.PsProject.WinRT.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid HorizontalAlignment="Left" Height="768" VerticalAlignment="Top" Width="1366">
<Grid.RowDefinitions>
<RowDefinition Height="61*"/>
<RowDefinition Height="707*"/>
</Grid.RowDefinitions>
<ListView x:Name="Files" HorizontalAlignment="Left" Height="446" VerticalAlignment="Top" Width="1366"
Margin="10,10,-10,0" Grid.Row="1" />
<Button x:Name="GoBack" x:Uid="ButtonGoBack" Content="Button" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
</Grid>
</Page>