0

我在 WinRT 的 ListView 中遇到了这种行为。

LayoutUpdated如果没有事件处理程序附加到 innerScrollViewerLayoutUpdated事件,则事件的触发频率会降低。

我用 标记了靠近底部的临界线// === 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>
4

0 回答 0