2009-07-12 35 views
20

Tôi có một TextBlock bên trong một điều khiển kích thước giới hạn. Nếu văn bản quá dài để vừa với điều khiển, tôi muốn hiển thị chú giải có văn bản đầy đủ. Đây là một hành vi cổ điển mà bạn chắc chắn biết từ nhiều ứng dụng.Hiển thị chú giải WPF nếu cần

Tôi đã thử sử dụng Trình chuyển đổi để chuyển đổi chiều rộng TextBlock thành Chế độ hiển thị của Tooltip.

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

Vấn đề là trong chuyển đổi:

public object Convert(object value, ... 

'giá trị' là mục DataBound. Tôi muốn 'giá trị' là TextBlock, để quan sát Chiều rộng của nó và so sánh nó với GridViewColumn.Width.

Trả lời

28

I figured it out, các Tooltip có PlacementTarget tài sản đó quy định cụ thể các yếu tố giao diện người dùng có các Tooltip. Trong trường hợp ai đó cần:

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

Sau đó viết một Trình chuyển đổi chuyển đổi TextBlock thành Visibility (dựa trên chiều rộng TextBlock).

0

Tôi nghĩ bạn phải xem xét trình kích hoạt ControlTemplate để giải quyết vấn đề này. Thật không may, trình kích hoạt ControlTemplate luôn luôn so sánh với một giá trị cụ thể, không nhỏ hơn hoặc lớn hơn. Bạn có thể làm cho nó xuất hiện, ví dụ: nếu Chiều rộng = 100, không phải Chiều rộng < 100.

6

Ok, vậy tại sao lại là cách duy nhất XAML khó? Đây hoạt động:

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

trong 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

Điều này có hoạt động với tính năng TextTrimming được bật không? Bởi vì sau đó TextBlock có lẽ sẽ không mất nhiều không gian hơn là có sẵn cho nó. – ygoe

Các vấn đề liên quan