WPF Textblock Tooltip не переносится - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь создать всплывающую подсказку, которая автоматически переносится (а также имеет расширенный режим, который принимает нормальное содержимое, но это позже). Во всяком случае, я устанавливаю содержимое в виде строки и превращаю содержимое в просто текстовый блок с переносом. Однако я не могу понять, почему это не работает. Вот стиль, над которым я работаю:

<Style x:Key="StHelpLinkBase" TargetType="{x:Type graphicElements:MyHelpLink}">
    <Setter Property="HorizontalContentAlignment" Value="Center" />
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="Foreground" Value="White" />
    <Setter Property="Background" Value="{StaticResource BrHelpLinkBackground}" />
    <Setter Property="Width" Value="12" />
    <Setter Property="Height" Value="12" />
    <Setter Property="Margin" Value="5" />
    <Setter Property="IsTabStop" Value="False" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type graphicElements:MyHelpLink}">
                <Grid x:Name="templateRoot">
                    <Image Source="Images/Icon_16_Help.png" Stretch="UniformToFill" MaxHeight="16" MaxWidth="16"
                           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                           VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                           x:Name="PART_Image">
                        <Image.ToolTip>
                            <ToolTip Background="{TemplateBinding Background}" BorderThickness="0" 
                                     DataContext="{Binding DataContext, ElementName=PART_Image}"
                                     TextElement.Foreground="{TemplateBinding Foreground}"
                                     ContentTemplate="{StaticResource DtTooltipAdvanced}"
                                     MaxWidth="150"
                                     x:Name="PART_Tooltip">
                                <ContentPresenter />
                            </ToolTip>
                        </Image.ToolTip>
                    </Image>
                </Grid>                    
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Вот основной ссылочный шаблон:

<DataTemplate x:Key="DtTooltipBasic">
    <Grid>
        <TextBlock Text="{Binding Content, RelativeSource={RelativeSource AncestorType=ToolTip}}" 
                   TextWrapping="Wrap" 
                   Foreground="White"
                   Margin="15"
                   FontFamily="Resources/#Artifakt Element"
                   FontSize="9pt" />
    </Grid>
</DataTemplate>

А вот использование (MyHelpLink наследует от ContentControl):

<graphicElements:MyHelpLink Content="This is some help text that is long and is just set as straight string in content but it should wrap I hope." />

Я попытался установить MaxWidth для всплывающей подсказки, как он есть сейчас, я попытался установить его в Grid, который находится в DataTemplate, и я попытался установить его в самом текстовом блоке, и все просто обрезали текст. Я также попытался установить свойство Width текстового блока напрямую и тоже самое ...

Так почему же это не обернуть?

1 Ответ

0 голосов
/ 10 мая 2018

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

Итак, я сделал два контрольных шаблона; один с оберточным текстовым блоком для общего содержимого и один с ContentPresenter для нестрокового содержимого. Затем я создал стиль с триггером для типа содержимого (в моем классе я создал собственное свойство зависимости только для чтения, которое указывает на запуск изменения, если содержимое представляет собой что-либо, кроме строки). Триггер изменяет шаблон с текстового блока переноса на предъявителя содержимого в зависимости от типа набора содержимого.

Если кто-нибудь знает, почему он не работает внутри DataTemplate, я хотел бы знать и пометит в качестве ответа ...

...