2

我有以下 listview 与 gridview 列和该 gridview 列的单元格模板。但是当我点击“超链接”时,相应的 gridview 行没有被选中。

谁能给我一个解决方案

数据模板

<DataTemplate x:Key="smTemplate">
     <StackPanel>
        <TextBlock TextWrapping="Wrap" Text="{Binding SM}" />
        <TextBlock>
            <Hyperlink x:Name="tHLink" Click="thL_Click"      KeyboardNavigation.IsTabStop="True">
                <TextBlock Text="TH" />
            </Hyperlink>
                    </TextBlock>                   
     </StackPanel>
</DataTemplate>            

列表显示

 <ListView Focusable="True">                
    <ListView.View>
       <GridView>
          <GridViewColumn Header="DM" CellTemplate="{StaticResource smTemplate}" />
       </GridView>
    </ListView.View>
    </ListView>
4

3 回答 3

1

尝试改变ListViewItem风格,这样当它获得键盘焦点时,它将被自动选择:

<ListView>
   <!-- ..... -->
   <ListView.ItemContainerStyle>
       <Style TargetType="{x:Type ListViewItem}">
           <Style.Triggers>
               <EventTrigger RoutedEvent="PreviewGotKeyboardFocus">
                   <BeginStoryboard>
                       <Storyboard>
                           <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsSelected">
                               <DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:0" />
                           </BooleanAnimationUsingKeyFrames>
                       </Storyboard>
                   </BeginStoryboard>
               </EventTrigger>
           </Style.Triggers>
       </Style>
   </ListView.ItemContainerStyle>
</ListView>
于 2013-07-16T09:56:02.590 回答
0

[不是一个好的答案]
在这里找到了一个好的解决方案。我只是复制并粘贴了以下代码并使用了它。它的工作。即使您单击白色空白,也会选择相应的行。

            <ControlTemplate TargetType="ListViewItem" x:Key="rowStyle1">
                <Grid x:Name="backGroundPanel">
                    <GridViewRowPresenter Content="{TemplateBinding Content}" />
                    <Rectangle Fill="White" Opacity="0"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter TargetName="backGroundPanel" Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
            <Style x:Key="columnHeaderContianerStyle" TargetType="ListViewItem">
                <Setter Property="Template" Value="{StaticResource ResourceKey=rowStyle1}"/>
            </Style>

我设置了listview的属性“ItemContainerStyle”,如下面的代码:

<ListView ItemContainerStyle="{DynamicResource columnHeaderContianerStyle}" ... >


[修改后的答案]
如果我们有兴趣在列控件中捕获鼠标,则上述解决方案不起作用。因为 backGroundPanel 中的矩形捕获了鼠标事件,所以它可以防止鼠标事件被 GridViewRowPresenter 捕获。所以我们必须使用具有两个特征的策略:

  1. 鼠标事件应由内栏控件捕获。
  2. 当用户单击行中的每个位置时,必须选择该行。

所以,这次解决方案变得更简单了。我为我的 ListView 的 ItemContainerStyle 使用了下面的代码。

<Style x:Key="columnHeaderContianerStyle" TargetType="ListViewItem">

            <EventSetter Event="PreviewMouseDown" Handler="ListViewItem_PreviewMouseDown"></EventSetter>
        </Style>

和事件处理程序是:

private void ListViewItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        if (sender is ListViewItem)
        {
            ListViewItem s = (ListViewItem)sender;
            s.IsSelected = true;
        }
    }

它适用于 2 个提到的功能。

于 2013-07-16T10:26:17.273 回答
0

Hyperlink覆盖OnMouseLeftButtonDownOnMouseLeftButtonUp. 在这些方法中,e.Handled = true处理您的事件处理程序之后设置,因此您不能通过将事件附加到 XAML 中的控件来覆盖它。为了修复行为以满足您的需要,您需要创建一个派生自并覆盖鼠标处理事件的类。Hyperlink

然而,这一切都是不必要的。从您的代码来看,Hyperlink导致的问题多于解决的问题,因此我建议将其替换为具有TextBlock自定义样式的单个控件。

<TextBlock Text="TH" TextDecorations="Underline" Cursor="Hand"
           Foreground="{x:Static SystemColors.HotTrackBrush}"/>
于 2013-07-16T09:26:04.333 回答