【问题标题】:ListBox ContentControl Click Not Selecting RowListBox ContentControl 单击不选择行
【发布时间】:2014-02-19 18:28:41
【问题描述】:

这些项目在

<ListBox.ItemTemplate> <DataTemplate>

我遇到的问题是左键单击第一个 ContentControl 没有选择行
左键单击 TextBlock 确实选择了行

如果我注释掉滚动查看器,它就可以工作。
所以看起来 ScrollViewer 正在吃点击。
我将尝试将 Visibility 移至 ScrollView。

visabilityConverterReverse 只返回 Visible 为 false 和 Collapsed 为 true
选择行时,我替换相同数据的更多字符

<TextBlock Grid.Row="0" Grid.Column="0" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis"                                                         
            Text="{Binding Path=FieldDefApplied.FieldDef.DispName}"/>
<ContentControl Grid.Row="0" Grid.Column="1" Margin="2,0,0,0" Padding="0" MouseRightButtonDown="cc_CopyToClip" FontWeight="Normal"
        Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected, Converter={StaticResource visabilityConverterReverse}}"                                                    
        Content="{Binding Path=DispValueShortRunHighlight, Converter={StaticResource stringToXaml}}"/>
<ScrollViewer Grid.Row="0" Grid.Column="1" Grid.RowSpan="3" Margin="5,0,0,0" Padding="0" 
            HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" MaxHeight="140">
    <ContentControl MouseRightButtonDown="cc_CopyToClip" 
        Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected, Converter={StaticResource bvc}}"
        Content="{Binding Path=DispValueRunHighlight, Converter={StaticResource stringToXaml}}"/>
</ScrollViewer>

【问题讨论】:

  • 刚刚在小样本中尝试过这个并为我工作。你能发布小的相关代码来重现这个问题吗?
  • @RohitVats 紧紧抓住,因为这是大量的代码,还有很多其他的东西在发生。可能是我在同一行和列中有两个 ContentControl,它们彼此相对可见。
  • 是的,问题可能出在其中。尝试在小样本中复制它,以便您可以轻松追踪它。大代码总是一团糟:)
  • @RohitVats 看来问题是 ScrollView。让我来解决这个问题。
  • @RohitVats 如果你想发布 ScrollViewer 是我会接受的问题。或者我只会删除。你告诉我它没有重现是解决了这个问题。

标签: .net wpf listbox contentcontrol


【解决方案1】:

我在使用 scrollViewer 的小样本中进行了尝试,并且能够重现问题。

ScrollViewer 可能会吃掉 MouseDown 事件,该事件不会传递到 ListBoxItem。


就像我上面所说的,这里是使用Snoop 拍摄的引发事件的快照。

如果您单击第一个 ContentControl,它会完美响应,因为 MouseDown 事件完美地到达 ListBoxItem,因此选择了 ListBoxItem。事件流程总结如下:

但在第二种情况下,当您单击 ScrollViewer 内部的 ContentControl 时,ScrollViwer 会通过处理 MouseDown 事件。这是第二种情况的流程:

【讨论】:

  • 直接在 ScrollViewer 上设置可见性修复了它。当它被折叠时,没有表面可以被击中。如果它吃了所选项目的点击,那么没有问题,因为该项目已经被选中。
  • 哦,太好了。这可能是我创建的小样本中的问题,其中 MouseDown 事件被吞噬,因此当我单击滚动查看器内托管的内容控件时,ListBoxItem 永远不会被选中。可能是我错过了那里的一些 xaml 代码。但无论如何,如果它为你解决了,那就没有问题了。祝你有美好的一天..!! :)
  • 同意 ScrollViewer 确实吃掉了点击。但是如果 ScrollViewer 被折叠,则没有要点击的表面。
猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多