将Label的内容设置为Image的Tooltip

时间:2013-12-29 07:49:54

标签: c# wpf visual-studio-2010

我正在使用IValueconverter界面来更改图像的工具提示文本 工具提示应根据标签进行更改。

<Label Content="9898980001" Height="28" HorizontalAlignment="Left" Margin="1733,231,0,0" Name="lbl02scanning" VerticalAlignment="Top" Foreground="Blue" >

<Image Height="49" HorizontalAlignment="Right" Margin="0,131,113,0" 
       Name="img02scanning"
       Source="/TEST;component/Images/LoadingStation.png" Stretch="Fill" 
       VerticalAlignment="Top" Width="30" Cursor="Hand">
    <Image.ToolTip>
        <StackPanel Background="AliceBlue">
            <TextBlock Padding="5" Foreground="White" MinHeight="20"
                       Background="Blue" FontWeight="Bold" 
                       Text="Scanning Station" />
             <StackPanel Orientation="Horizontal">
                <Image 
   Source="pack://application:,,,/TEST;component/Images/coilonsaddle_large.png" 
   Height="100" Width="100" />
                 <TextBlock Padding="10" TextWrapping="WrapWithOverflow"
                            MaxWidth="200" Background="AliceBlue"
                            Foreground="Black" FontWeight="Bold"
                            Text="{Binding ElementName=lbl02scanning, Path=Name, 
                                           ConverterParameter=255,
                             Converter={StaticResource FormatterFOrCoilToolTip}}"/>                                       
              </StackPanel>
              <TextBlock Padding="5" Foreground="White" MinHeight="20" 
                         Background="Blue" FontWeight="Bold"
                         Text="Report to admin in case of coil location mismatch"/>
         </StackPanel>
    </Image.ToolTip>  
</Image>

转换器类:

 public class FormatterForCoilToolTip : IValueConverter
    {

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {

      if(parameter.ToString() == "02")
      {
      return value.ToString() + " Startin";
      }
      else
      {
      return value.ToString() + " Finishing";
          }
    }


    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

工具提示的Textblock内容不会改变。但如果我改为:

Text="{Binding  ConverterParameter=255, Converter={StaticResource FormatterFOrCoilToolTip}}

然后它正在运作。但我想传递lbl02扫描文本值。为什么它不起作用?

2 个答案:

答案 0 :(得分:2)

首先,如果你想要标签文本,你应该绑定到Content属性而不是Name属性。

最重要的是工具提示与标签不在同一个视觉树中,因此与elementName的绑定将不起作用。但是,即使元素不存在于同一个Visual Tree中,也可以使用x:Reference来获取元素。

Text="{Binding Source={x:Reference lbl02scanning}, Path=Content, 
               ConverterParameter=255,
               Converter={StaticResource FormatterFOrCoilToolTip}}"/>

注 - x:WPF 4.0中引入了参考。如果您使用的是WPF 3.5,则无法使用此功能。


错误

更新 - 服务提供商缺少名称解析程序服务

刚发现的错误报告Microsoft site x:Reference fails in case Target is Label。但是,我无法在我的最后重现这个问题,因为我已经安装了WPF 4.5,我想他们已经在未来的版本中解决了这个问题。

如果您定位WPF 4.0,我建议您使用TextBlock代替Label

<TextBlock Text="9898980001" Height="28" HorizontalAlignment="Left"
           Margin="1733,231,0,0" Name="lbl02scanning" VerticalAlignment="Top" 
           Foreground="Blue" />

然后使用Text属性绑定而不是Content

Text="{Binding Source={x:Reference lbl02scanning}, Path=Text, 
               ConverterParameter=255,
               Converter={StaticResource FormatterFOrCoilToolTip}}"/>

您可以参考变通方法提供的变通方法部分here

您可以覆盖Reference类的ProvideValue方法,并在设计时跳过参考搜索登录:

[ContentProperty("Name")]
public class Reference : System.Windows.Markup.Reference
{
    public Reference()
        : base()
    { }

    public Reference(string name)
        : base(name)
    { }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        IProvideValueTarget valueTargetProvider = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;

        if (valueTargetProvider != null)
        {
            DependencyObject targetObject = valueTargetProvider.TargetObject as DependencyObject;

            if (targetObject != null && DesignerProperties.GetIsInDesignMode(targetObject))
            {
                 return null;
            }
        }

        return base.ProvideValue(serviceProvider);
    }

使用其他解决方法进行更新

这适用于所有版本的WPF 3.5,WPf 4.0和WPF 4.5

  

首先所有带有标签内容的绑定图片标记。

     

第二次在您的ToolTip控件中托管您的stackPanel,以便您可以   利用PlacementTarget属性。

     

第三次与工具提示的PlacementTarget.Tag绑定。

相关代码如下所示:

<Image Tag="{Binding ElementName=lbl02scanning,Path=Content}">
   <Image.ToolTip>
      <ToolTip>
          <TextBlock Text="{Binding RelativeSource={RelativeSource 
                                    Mode=FindAncestor, AncestorType=ToolTip},
                                    Path=PlacementTarget.Tag,
                                    ConverterParameter=255,
                           Converter={StaticResource FormatterFOrCoilToolTip}}"/>
       </ToolTip>
   </Image.ToolTip>
</Image>

此外,您需要更新转换器代码以对其进行null检查,因为在您打开工具提示之前,PlacementTarget将为null。

    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            if (parameter.ToString() == "02")
            {
                return value.ToString() + " Starting";
            }
            else
            {
                return value.ToString() + " Finishing";
            }
        }
        return String.Empty;
    }

答案 1 :(得分:0)

试试这个

Text="{Binding Path=Content,ElementName=lbl02scanning, ConverterParameter=255, Converter={StaticResource FormatterFOrCoilToolTip}}