2

グリッドビュー列とそのグリッドビュー列のセル テンプレートを含む次のリストビューがあります。しかし、「ハイパーリンク」をクリックすると、対応するグリッドビューの行が選択されません。

誰か私に解決策を教えてください

データ テンプレート

<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>

以下のコードのように、リストビューのプロパティ「ItemContainerStyle」を設定します。

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


[修正された回答]
列コントロールでマウスをキャプチャすることに関心がある場合、上記の解決策は機能しません。backGroundPanel の四角形はマウス イベントをキャプチャするため、マウス イベントが GridViewRowPresenter によってキャプチャされるのを防ぎます。したがって、2 つの機能を持つ戦略を使用する必要があります。

  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 に答える