Пользовательская подсказка WPF - PullRequest
2 голосов
/ 05 июля 2011

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

<Style x:Key="AppToolTip"
   TargetType="ToolTip">
<Setter Property="OverridesDefaultStyle" Value="true" />    
<Setter Property="Template">
        <Setter.Value>

            <ControlTemplate TargetType="ToolTip">
                <StackPanel>
                    <Label Content="{TemplateBinding Content}" FontWeight="Bold" Background="Blue" Foreground="White">

                    </Label>
                    <TextBlock Padding="10" TextWrapping="WrapWithOverflow" Width="200">

                    </TextBlock>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value></Setter>
</Style>

И может успешно применить этот стиль к кнопке, подобной этой, и иметь заголовок всплывающей подсказки:

<Button.ToolTip>
<ToolTip Style="{DynamicResource PalletToolTip}">
                    <Binding Source="{x:Static ResStrings.New}"/>
                </ToolTip>
</Button.ToolTip>

Что я застрял на том, как я могу установить содержание дополнительного описательного текста от использования выше? Я уже привязываю данные к свойству Content при отображении заголовка всплывающей подсказки. Любой, кто читал книгу Адама Натана «Развязанный WPF», поймет, что я использую его пример подсказки XAML, но в его случае он использовал жестко закодированные строки для содержимого метки и текстового блока. Я хочу создать что-то более пригодное для повторного использования и, следовательно, хочу использовать привязку данных для достижения того же эффекта.

Ответы [ 2 ]

6 голосов
/ 05 июля 2011

Я бы унаследовал класс HeaderedToolTip от ToolTip и добавил бы свойство Header.Я бы указал шаблон для этого элемента управления так же, как вы сделали.Тогда я мог бы использовать это так:

<Button>
    <Button.ToolTip>
        <HeaderedToolTip Header="My Title" Content="My Content"/>
    </Button.ToolTip>
</Button>

Или с привязками:

<Button>
    <Button.ToolTip>
        <HeaderedToolTip Header="{Binding ToolTipTitle}" Content="{Binding ToolTipText}"/>
    </Button.ToolTip>
</Button>
2 голосов
/ 05 июля 2011

Вы можете использовать объект или ViewModel, который содержит все необходимые свойства, которые вам нужны во всплывающей подсказке.

class MyToolTipViewModel : INotifyPropertyChanged
{
    public string Header
    {
       get{ return mHeader;}
       set{ mHeader = value; RaisePropertyChanged("Header"); }
    }

    public void RaisePropertyChanged(string aProperty)
    {
     // .. implementation of INotifyPropertyChanged
    }
}

тогда вы можете установить tolltip непосредственно для экземпляра этого класса.

myButton.ToolTip = new MyToolTipViewModel();

теперь после этого в вашей подсказке будет просто отображаться полное имя класса ViewModel. Теперь вам нужен DataTemplate, который сообщает WPF, как преобразовать класс в визуальный объект.

<DataTemplate DataType="{x:Type MyToolTipViewModel}">
    <TextBlock Text="{Binding Header}"/>
</DataTemplate>

DataTemplate необходимо поместить в дерево ресурсов. В разделе ресурсов объекта более высокого уровня или непосредственно на уровне ресурсов приложения или окна.

Надеюсь, это поможет.

...