WPF Microsoft.Xaml.Behaviors.WPF, EventTrigger EventName="PreviewMouseDown" the tunnel event, while the MouseDown can't trigger the command because it was swallowed

    <behavior:Interaction.Triggers>
        <behavior:EventTrigger EventName="PreviewMouseDown">
            <behavior:InvokeCommandAction Command="{Binding PreviewMouseDownCmd}"/>
        </behavior:EventTrigger>
    </behavior:Interaction.Triggers>
private DelCmd previewMouseDownCmd;
public DelCmd PreviewMouseDownCmd
{
    get
    {
        if(previewMouseDownCmd==null)
        {
            previewMouseDownCmd = new DelCmd(PreviewMouseDownCmdExecuted, PreviewMouseDownCmdCanExecute);
        }
        return previewMouseDownCmd;
    }
}

private bool PreviewMouseDownCmdCanExecute(object? arg)
{
    return IsLoading == true ? false : true;
}

private void PreviewMouseDownCmdExecuted(object? obj)
{
    _ = InitBooksCollectionAsync(20000000);
}

private async Task InitBooksCollectionAsync(int cnt = 10000000)
{
    if (IsLoading)
    {
        return;
    }
    IsLoading = true;
    if (cnt <= 0)
    {
        return;
    }

    try
    {
        BooksCollection = new ObservableCollection<Book>();
        
        int batchCount = (cnt - 1 + batchSize) / batchSize;
        for (int batch = 0; batch < batchCount; batch++)
        {
            int actualSize = Math.Min(batchSize, cnt - batch * batchSize);
            List<Book> bksList = new List<Book>(actualSize);
            await Task.Run(() =>
            {
                for (int i = 0; i < actualSize; i++)
                {
                    var a = GetIncrementId();
                    bksList.Add(new Book()
                    {
                        Id = a,
                        Name = $"Name_{a}",
                        ISBN = $"ISBN_{a}",
                        Abstract = $"Abstract_{a}",
                        Author = $"Author_{a}",
                        Comment = $"Comment_{a}",
                        Content = $"Content_{a}",
                        Summary = $"Summary_{a}",
                        Title = $"Title_{a}",
                        Topic = $"Topic_{a}"
                    });
                }
            }).ConfigureAwait(false);
            await PopulateBooksCollectionAsync(batch, bksList);
        }
    }
    finally
    {
        IsLoading = false;
    }
}

private async Task PopulateBooksCollectionAsync(int batch, List<Book> bksList)
{
    await Application.Current.Dispatcher.InvokeAsync(() =>
    {
        foreach (var bk in bksList)
        {
            BooksCollection.Add(bk);
        }
        bksList.Clear();
        MainTitle = $"{DateTime.Now}," +
        $"batch:{batch + 1}," +
        $"loaded {BooksCollection.Count} items," +
        $"First Id:{BooksCollection[0]?.Id}," +
        $"Last Id:{BooksCollection[^1]?.Id}," +
        $"{GetMem()}";
    }, System.Windows.Threading.DispatcherPriority.Background);
}

 

 

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:behavior="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Background="White"
        Title="{Binding MainTitle}" WindowState="Maximized">
    <Window.InputBindings>
        <MouseBinding Command="{Binding LeftMouseDownCommand}"
                      Gesture="LeftClick" />
    </Window.InputBindings>
    <Window.DataContext>
        <local:MainVM/>
    </Window.DataContext>
    <!--<behavior:Interaction.Triggers>
        <behavior:EventTrigger EventName="PreviewMouseDown">
            <behavior:InvokeCommandAction Command="{Binding PreviewMouseDownCmd}"/>
        </behavior:EventTrigger>
    </behavior:Interaction.Triggers>-->
    <Grid Background="White"
          IsHitTestVisible="True">
        <!--<Grid.InputBindings>
            <MouseBinding Command="{Binding LeftMouseDownCommand}" Gesture="LeftClick" />
        </Grid.InputBindings>-->
        <ItemsControl ItemsSource="{Binding BooksCollection}">
            <ItemsControl.Resources>
                <Style TargetType="MenuItem">
                    <Setter Property="FontSize" Value="30"/>
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="FontSize" Value="50"/>
                            <Setter Property="Foreground" Value="Red"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ItemsControl.Resources>
            <ItemsControl.Template>
                <ControlTemplate>
                    <ScrollViewer CanContentScroll="True">
                        <VirtualizingStackPanel IsItemsHost="True"
                                                VirtualizingPanel.IsVirtualizing="True"
                                                VirtualizingPanel.VirtualizationMode="Recycling"
                                                VirtualizingPanel.CacheLengthUnit="Item"
                                                VirtualizingPanel.CacheLength="2,2"
                                                ScrollViewer.CanContentScroll="True"
                                                ScrollViewer.IsDeferredScrollingEnabled="True"
                                                UseLayoutRounding="True"
                                                SnapsToDevicePixels="True">                            
                        </VirtualizingStackPanel>
                    </ScrollViewer>
                </ControlTemplate>
            </ItemsControl.Template>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="20">
                        <Grid.InputBindings>
                            <MouseBinding Command="{Binding DataContext.LeftMouseDownCommand, 
                            RelativeSource={RelativeSource AncestorType=Window}}" 
                                      Gesture="LeftClick" />
                        </Grid.InputBindings>
                        <Grid.Resources>
                            <Style TargetType="TextBlock">
                                <Setter Property="FontSize" Value="30"/>
                                <Style.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter Property="FontSize" Value="40"/>
                                        <Setter Property="Foreground" Value="Red"/>
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </Grid.Resources>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding Id}" Grid.Row="0" Grid.Column="0"/>
                        <TextBlock Text="{Binding Name}" Grid.Row="0" Grid.Column="1"/>
                        <TextBlock Text="{Binding ISBN}" Grid.Row="0" Grid.Column="2"/>
                        <TextBlock Text="{Binding Author}" Grid.Row="1" Grid.Column="0"/>
                        <TextBlock Text="{Binding Abstract}" Grid.Row="1" Grid.Column="1"/>
                        <TextBlock Text="{Binding Comment}" Grid.Row="1" Grid.Column="2"/>
                        <TextBlock Text="{Binding Summary}" Grid.Row="2" Grid.Column="0"/>
                        <TextBlock Text="{Binding Title}" Grid.Row="2" Grid.Column="1"/>
                        <TextBlock Text="{Binding Topic}" Grid.Row="2" Grid.Column="2"/>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Load Data"
                              Command="{Binding LoadDataCmd}"/>
                </ContextMenu>
            </ItemsControl.ContextMenu>
        </ItemsControl>
    </Grid>
</Window>

 

posted @ 2026-06-08 23:27  FredGrit  阅读(3)  评论(0)    收藏  举报