2

我有一个 ListBox 显示人才对象的 ObservableCollection。当用户将鼠标悬停在 ListBox 中的每个项目上时,我想在 ToolTip 中显示有关人才的几条信息。

我的列表框:

<ListBox ItemsSource="{Binding ElementName=CE_Races_racesLB, Path=SelectedItem.Talents}" ItemTemplate="{StaticResource removableTalentListTemplate}" />

项目模板:

<DataTemplate x:Key="removableTalentListTemplate">
    <StackPanel>
        <TextBlock FontSize="13" Text="{Binding Path=tName}" VerticalAlignment="Center" Width="175" Height="18" Grid.Column="0" />
    </StackPanel>
</DataTemplate>

如果我将 ToolTipService.ToolTip="{Binding Path=Description" 添加到 TextBlock 属性,我可以显示人才的描述。但是,当我尝试像这样创建自定义工具提示时:

<DataTemplate x:Key="removableTalentListTemplate">
    <StackPanel>
        <TextBlock FontSize="13" Text="{Binding Path=tName}" VerticalAlignment="Center" Width="175" Height="18" Grid.Column="0" />
            <TextBlock.ToolTip>
                <ToolTip>
                    <StackPanel>
                        <TextBlock Text="{Binding Path=Description}" />
                    </StackPanel>
                </ToolTip>
            </TextBlock.ToolTip>
        </TextBlock>
    </StackPanel>
</DataTemplate>

当我将鼠标悬停在 ListBox 项上时,工具提示只会显示“System.Windows.Controls.StackPanel”。我真的很想创建一个显示大量信息的漂亮工具提示,但我无法克服这个障碍。这是它现在的截图: http: //silkforge.com/dev/ss.jpg。您看不到鼠标,但您可以在 ListBox 项“Acute Hearing I”下看到工具提示。

4

3 回答 3

5

你试过这个吗?

<TextBlock Text="{Binding Path=tName}">
  <ToolTipService.ToolTip>
    <StackPanel>
      <TextBlock Text="{Binding Path=Description}" />
    </StackPanel>
  </ToolTipService.ToolTip>
</TextBlock>
于 2013-01-03T22:26:48.140 回答
2

快速测试后,您的代码似乎可以正常工作。

我的测试:

xml:

 <Window x:Class="WpfApplication4.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication4"
            xmlns:Controls="clr-namespace:Liz.Common"
           Title="MainWindow" Height="300" Width="400" Name="UI" >

 <Window.Resources>
    <DataTemplate x:Key="removableTalentListTemplate">
            <StackPanel>
                <TextBlock FontSize="13" Text="{Binding Path=tName}" VerticalAlignment="Center" Width="175" Height="18" Grid.Column="0" >
                    <TextBlock.ToolTip>
                        <ToolTip Background="Blue">
                            <StackPanel>
                                <TextBlock Text="{Binding Path=Description}" Foreground="White" />
                            </StackPanel>
                        </ToolTip>
                    </TextBlock.ToolTip>
                </TextBlock>
            </StackPanel>
        </DataTemplate>
     </Window.Resources>

        <Grid>
            <ListBox ItemTemplate="{StaticResource removableTalentListTemplate}" ItemsSource="{Binding ElementName=UI, Path=Models}" />
        </Grid>
    </Window>

代码:

public partial class MainWindow : Window
{
    private ObservableCollection<MyModel> _models = new ObservableCollection<MyModel>();

    public MainWindow()
    {
        InitializeComponent();
        Models.Add(new MyModel { tName = "Test", Description = "Hello" });
    }

    public ObservableCollection<MyModel> Models
    {
        get { return _models; }
        set { _models = value; }
    }
}

public  class MyModel : INotifyPropertyChanged
{
    private string _tName;
    private string _description;

    public string tName 
    {
        get { return _tName; }
        set { _tName = value; NotifyPropertyChanged("tName"); } 
    }

    public string Description
    {
        get { return _description; }
        set { _description = value; NotifyPropertyChanged("Description"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

结果: 在此处输入图像描述

于 2013-01-03T22:34:34.400 回答
0

我不知道我是否遇到过与 OP 相同的问题,但对我来说麻烦的根源是以下隐式风格:

<Style TargetType="{x:Type ToolTip}">
   <Setter Property="ContentTemplate">
       <Setter.Value>
           <DataTemplate>
               <TextBlock TextWrapping="Wrap" Text="{Binding}" MaxWidth="600"/>
           </DataTemplate>
       </Setter.Value>
   </Setter>
</Style>

这种风格的目的是消除冗长的工具提示超出可视屏幕区域,但它只适用于标准的内联工具提示。尝试创建自定义的、详细的工具提示会导致 OP 报告的“System.Windows.Controls.StackPanel”。删除这种隐式样式立即解决了问题......但是也删除了不错的 600 DIP 宽度限制。

于 2018-08-13T13:16:03.123 回答