Показать подсказку WPF, если это необходимо - PullRequest
21 голосов
/ 12 июля 2009

У меня есть TextBlock внутри элемента управления ограниченного размера. Если текст слишком длинный, чтобы поместиться в элемент управления, я хотел бы показать всплывающую подсказку с полным текстом. Это классическое поведение, которое вы наверняка знаете по многим приложениям.

Я пытался использовать конвертер для преобразования ширины TextBlock в видимость подсказки.

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

Проблема в том, что в конвертере:

public object Convert(object value, ...

'value' - элемент DataBound. Я хотел бы, чтобы значением было TextBlock, чтобы наблюдать его ширину и сравнить его с GridViewColumn.Width.

Ответы [ 3 ]

30 голосов
/ 17 июля 2009

Я понял, во всплывающей подсказке есть свойство 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 в видимость (на основе ширины TextBlock).

4 голосов
/ 12 июля 2009

Ладно, так почему это сложный способ только для 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 голосов
/ 12 июля 2009

Я думаю, вы должны посмотреть на триггер ControlTemplate, чтобы решить эту проблему. К сожалению, триггеры ControlTemplate всегда сравниваются с определенным значением, не меньше или больше чем. Вы можете сделать это, например, если ширина = 100, а не ширина <100. </p>

...