2011-07-07 23 views
3

私はWPFにはかなり新しくなっています。学ぶことがたくさんあり、ゆっくりとそこに着いていると思います。私は表示とユーザーの入力に使用されるDataGridを持っていますが、それはアプリケーション全体の主な焦点であるため、非常にトリッキーなグリッドです。私はいくつかの列が読み込み専用であり、CellStyle Setterを使用してKeyboardNavigation.IsTabStopをFalseに設定して、ユーザー入力を重要な列に集中させ、うまく動作させるようにしました。読み込み専用の列をツールチップに表示してフォーカスを取得しないハイパーリンクにしたいのですが、同時に3つの要件をすべて満たすXAMLを作成するのに苦労しています。WPF DataGridハイパーリンクの外観と振る舞い

列の1つは、行の項目に注釈があるかどうかを示すことです。私は、Notesプロパティで、実際のノートを表示DataGridTemplateColumn中とツールチップ上のセル内HasNotesのプロパティを表示するには、次のXAMLを使用しています

  <DataGridTemplateColumn x:Name="NotesColumn" Header="Notes"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding HasNotes, Mode=OneWay}"> 
          <TextBlock.ToolTip> 
           <TextBlock Text="{Binding Notes}" MaxWidth="300" TextWrapping="Wrap" /> 
          </TextBlock.ToolTip> 
         </TextBlock> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
       <DataGridTemplateColumn.CellStyle> 
        <Style> 
         <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/> 
        </Style> 
       </DataGridTemplateColumn.CellStyle> 
      </DataGridTemplateColumn> 

正常に動作しますが、私はそれハイパーリンクしたいと思いますセルの内容をクリックするとノートで何かを行うことができます。

私は、ハイパーリンクに測定単位を表示するために使用されるDataGridHyperlinkColumnという別の列を持っています。クリックすると、単位を変更できます。 (これは、ComboBoxではなく、このようにした理由は、ユーザーがユニットを変更できるようにするために、インターフェースを変更するための非常に慎重な行為なのです。ユニット、誤って行うことはできません)。以下のXAMLは、ハイパーリンク列のXAMLとのユニット

ため
  <DataGridHyperlinkColumn x:Name="ResultUnitLink" Binding="{Binding Path=Unit.Code}" Header="Unit" Width="Auto" IsReadOnly="True"> 
       <DataGridHyperlinkColumn.CellStyle> 
        <Style> 
         <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/> 
        </Style> 
       </DataGridHyperlinkColumn.CellStyle> 
       <DataGridHyperlinkColumn.ElementStyle> 
        <Style> 
         <EventSetter Event="Hyperlink.Click" Handler="ChangeUnit" /> 
        </Style> 
       </DataGridHyperlinkColumn.ElementStyle> 
      </DataGridHyperlinkColumn> 

一つの問題にハイパーリンク列を置くにはIsTabStop = Falseの場合、グリッドをタブ移動するとき、私のハイパーリンク列はまだ受けて、動作するように表示されないということですIsTabStopを変更するためにセッターを使用した他の列とは異なります。押しが押されると私はそれで生きることができたが、むしろそうはしたくない。

私が実際に両方の列から欲しいのは、2つの外観/ビヘイビア、つまりTabStop = Falseのハイパーリンク上にデータが表示され、上に置かれたときに別のプロパティのツールチップを表示する列の合併です。

誰もが次のことを実現し、列を取得する方法を私に助言するのに役立ちます。で使用した場合、実際に動作することを

  • 偽IsTabStop =を別のプロパティを表示する
  • ツールチップつのプロパティを表示

    1. ハイパーリンクハイパーリンク

    事前にお手伝いいただける方に感謝します。

  • 答えて

    4

    過去にハイパーリンクに問題があったため、ラベルやボタンにハイパーリンクのように見せるためにこのスタイルを使用してください。列テンプレートをボタンまたはラベルにして、このスタイルを適用してみてください。

    <Style x:Key="ButtonAsLinkStyle" TargetType="{x:Type Button}"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type Button}"> 
           <TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
            <ContentPresenter ContentStringFormat="{TemplateBinding ContentStringFormat}" /> 
           </TextBlock> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
        <Setter Property="Foreground" Value="Blue" /> 
        <Setter Property="Cursor" Value="Hand" /> 
        <Style.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Foreground" Value="Red" /> 
         </Trigger> 
        </Style.Triggers> 
    </Style> 
    
    +0

    それを私のDataGridの2つの列に配置し、ツールチップを整理してフォーカスを受け取るのをやめ、ハイパーリンクのように見えて振る舞います。まさに私が探していたもの。どうもありがとう。 – PGibsonCoUk