2009-07-12 12 views
20

제한된 크기의 컨트롤 안에 TextBlock이 있습니다. 텍스트가 너무 길어 컨트롤에 맞지 않으면 전체 텍스트와 함께 툴팁을 표시하고 싶습니다. 이는 많은 앱에서 분명히 알고있는 고전적인 동작입니다.필요한 경우 WPF 툴팁 표시

변환기를 사용하여 TextBlock 너비를 도구 설명의 가시성으로 변환하려고 시도했습니다.

public object Convert(object value, ... 

'값'데이터 바인딩 항목입니다 :

<GridViewColumn.CellTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Text}"> 
      <TextBlock.ToolTip> 
       <ToolTip 
        DataContext="{TemplateBinding Content}" 
        Visibility="{Binding Converter={StaticResource visConvert}}"> 

         <TextBlock Text="{Binding Text}"></TextBlock> 
       </ToolTip> 
      </TextBlock.ToolTip> 
     </TextBlock> 
    </DataTemplate> 
</GridViewColumn.CellTemplate> 

문제는 변환기에 있다는 것입니다. 'value'를 TextBlock으로, 너비를 관찰하고 GridViewColumn.Width와 비교하고 싶습니다.

답변

28

내가 그것을 알아 냈어, 도구 설명은 도구 설명이있는 UI 요소를 지정 PlacementTarget 속성이 있습니다. 누구나 필요로하는 경우 :

<TextBlock Text="{Binding Text}"> 
    <TextBlock.ToolTip> 
     <ToolTip 
      DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}" 
      Visibility="{Binding Converter={StaticResource toolVisConverter}}"> 
      <TextBlock Text="{Binding Text}"/> <!-- tooltip content --> 
     </ToolTip> 
    </TextBlock.ToolTip> 
</TextBlock> 

그런 다음 TextBlock을 Visibility (TextBlock 너비를 기준으로)로 변환하는 변환기를 작성하십시오.

0

이 문제를 해결하려면 ControlTemplate 트리거를 살펴 봐야한다고 생각합니다. 불행히도 ControlTemplate 트리거는 항상보다 작거나 큰 특정 값과 비교합니다. 예를 들어 폭 = 100, 너비가 아닌 경우 < 100.

6

그래, 그렇다면 왜 하드 XAML 만 사용합니까? 이 작품 :

<TextBlock Text="{Binding Text}" 
    IsMouseDirectlyOverChanged="TextBlock_IsMouseDirectlyOverChanged" > 
    <TextBlock.ToolTip> 
    <ToolTip Visibility="Collapsed"> 
     <TextBlock Text="{Binding Text}"></TextBlock> 
    </ToolTip> 
    </TextBlock.ToolTip> 
</TextBlock> 

Control.xaml.cs에 :

private void TextBlock_IsMouseDirectlyOverChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    bool isMouseOver = (bool)e.NewValue; 
    if (!isMouseOver) 
     return; 
    TextBlock textBlock = (TextBlock)sender; 
    bool needed = textBlock.ActualWidth > 
     (this.listView.View as GridView).Columns[2].ActualWidth; 
    ((ToolTip)textBlock.ToolTip).Visibility = 
     needed ? Visibility.Visible : Visibility.Collapsed; 
} 
+0

TextTrimming과 함께 작동합니까? 왜냐하면 TextBlock은 아마도 사용할 수있는 공간보다 더 많은 공간을 차지하지 않기 때문입니다. – ygoe