无法将鼠标滚动到 TreeViews 列表

Can't mouse scroll over list of TreeViews

我有一个列表视图,其项目模板是树视图(具有固定的高度和宽度)。 xaml 或代码不多 post .

现在,如果鼠标不在 TreeView 上,我可以滚动列表。 如何在鼠标悬停在任何 TreeView 上时滚动列表?

我们可以通过一些行为来解决这个问题。简单示例:

带有评论的行为:

public sealed class ScrollParentBehavior : Behavior<UIElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.PreviewMouseWheel += AssociatedObjectOnPreviewMouseWheel;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.PreviewMouseWheel -= AssociatedObjectOnPreviewMouseWheel;
        base.OnDetaching();
    }

    private void AssociatedObjectOnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        // find parent, it will be ContentPresenter
        var parent = VisualTreeHelper.GetParent(AssociatedObject) as UIElement;
        if (parent == null) return;
        // handle event

        // We can create here some logic, if we need to scroll TreeView content

        e.Handled = true;
        // raise it on parent
        parent.RaiseEvent(new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
        {
            RoutedEvent = UIElement.MouseWheelEvent
        });
    }
}

以及用法-ItemTemplate中的ListView和TreeView。

<ListView ItemsSource="{Binding}">
    <ListView.ItemTemplate>
         <DataTemplate>
              <TreeView Width="100" Height="100">
                  <i:Interaction.Behaviors>
                      <local:ScrollParentBehavior />
                  </i:Interaction.Behaviors>
              </TreeView>
         </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

不要忘记 XAML:

的 xmlns
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

和 System.Windows.Interactivity 在参考文献中。

您可以为 TreeView 设置 IsHitTestVisible="False"。 简单示例:

<Window x:Class="WpfApplication6.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ListView Margin="10" x:Name="lvDataBinding" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <TreeView IsHitTestVisible="False">
                        <TreeViewItem Header="{Binding Id}" />
                    <TreeViewItem Header="{Binding Name}" />
                    <TreeViewItem Header="{Binding Details}" />
                </TreeView>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<User> users = new List<User>();
        users.Add(new User() { Id = 1, Name = "John Doe", Birthday = new DateTime(1971, 7, 23) });
        users.Add(new User() { Id = 2, Name = "Jane Doe", Birthday = new DateTime(1974, 1, 17) });
        users.Add(new User() { Id = 3, Name = "Sammy Doe", Birthday = new DateTime(1991, 9, 2) });
        users.Add(new User() { Id = 4, Name = "Sammy Doe1", Birthday = new DateTime(1991, 9, 2) });
        users.Add(new User() { Id = 5, Name = "Sammy Doe2", Birthday = new DateTime(1991, 9, 2) });
        users.Add(new User() { Id = 6, Name = "Sammy Doe3", Birthday = new DateTime(1991, 9, 2) });
        lvDataBinding.ItemsSource = users;
    }
}

public class User
{
    public int Id { get; set; }

    public string Name { get; set; }

    public DateTime Birthday { get; set; }

    public string Details
    {
        get
        {
            return String.Format("{0} was born on {1} and this is a long description of the person.", this.Name, this.Birthday.ToLongDateString());
        }
    }
}