Silverlight 4. Как установить всплывающую подсказку с элементами управления в файле ResourceDictionary с определениями стилей? - PullRequest
0 голосов
/ 16 декабря 2011

Я посмотрел десятки вопросов и ответов, но не нашел ответа на эту, по-видимому, простую потребность.

Я работаю с Silverlight 4. Я хочу определить всплывающую подсказку с элементами управления в нем в файле ResourceDictionary, который имеет определения стиля.

Мой пользовательский управляющий файл "UC_Activity.xaml" имеет:

...
<TextBox Style="{StaticResource Style0}" Name="tb_id" />
...

Если мой файл "Styles.xaml" имеет

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
    <Style x:Key="Style0" TargetType="TextBox">
        <Setter Property="FontSize" Value="12" />
        <Setter Property="FontFamily" Value="Portable User Interface" />
        <Setter Property="ToolTipService.ToolTip" Value="Long tooltip text here. This WORKS, but part of the text ends up out of the screen." />
    </Style>
</ResourceDictionary>

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

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
    <Style x:Key="Style0" TargetType="TextBox">
        <Setter Property="FontSize" Value="12" />
        <Setter Property="FontFamily" Value="Portable User Interface" />
        <Setter Property="ToolTipService.ToolTip">
            <Setter.Value>
                <StackPanel>
                    <sdk:Label Content="Short text here."/>
                    <TextBlock TextWrapping="Wrap" MaxWidth="200" Text="Long text here. This does NOT WORK." />
                </StackPanel>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

но это НЕ РАБОТАЕТ. Он строится нормально, но выдает исключение («Значение не попадает в ожидаемый диапазон.») При запуске выполнения.

Пожалуйста, как я могу это сделать? Большое спасибо.

1 Ответ

0 голосов
/ 19 декабря 2011

У меня была похожая проблема, проблема в том, что это должен быть DataTemplate, чтобы при каждом его использовании в визуальное дерево добавлялся другой экземпляр.Я создал прикрепленное свойство для этого:

, тогда его можно использовать следующим образом:

<Setter Property="ControlsBehaviours:TooltipTemplate.Template">
    <Setter.Value>
            <DataTemplate>
                <ToolTip Content="tooltip" />
            </DataTemplate>
        </Setter.Value>
    </Setter>

public class TooltipTemplate
{
    /// <summary>
    /// Template Dependency Property.
    /// </summary>
    public static readonly DependencyProperty TemplateProperty =
        DependencyProperty.RegisterAttached(
            "Template",
            typeof (DataTemplate),
            typeof (TooltipTemplate),
            new PropertyMetadata(new PropertyChangedCallback(TemplateChanged)));

    public static void SetTemplate(DependencyObject o, DataTemplate value)
    {
        o.SetValue(TemplateProperty, value);
    }

    public static DataTemplate GetTemplate(DependencyObject o)
    {
        return (DataTemplate) o.GetValue(TemplateProperty);
    }

    private static void TemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ToolTipService.SetToolTip(d, ((DataTemplate)e.NewValue).LoadContent());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...