我在 WinRT 的 ListView 中遇到了这种行为。
LayoutUpdated
如果没有事件处理程序附加到 innerScrollViewer
的LayoutUpdated
事件,则事件的触发频率会降低。
我用 标记了靠近底部的临界线// === Critical line ===
。删除前导斜杠将导致lv_LayoutUpdated
更频繁地调用。
这会产生影响,因为该事件很少被触发,以至于它对我没有任何用处(在注释掉的情况下)问题是,我无法在ScrollViewer
' 的突变结束之前设置滚动位置。不过,通过 ' 事件进行路由ScrollViewer
似乎很愚蠢。
这是一个错误还是可以用冒泡策略或某事来解释?
编辑:顺便说一句,此页面未显示在应用程序的根框架中,而是显示在不同页面的框架中,如果这有什么不同的话。
EDIT2:我最终发现了为什么触发时间没用(正在执行数据绑定异步,这与标准事件时间有关)。但是,这种行为仍然存在 - 订阅ScrollViewer
' 事件会导致 ' 事件发布更多内容ListView
。这最终会在什么其他情况下发生,我不知道。我正在使用 Caliburn.Micro - 所以他们的数据源接线可能会对控件产生影响。例如,CM 的一个问题是,它吞下了视图的第一个 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>