【问题标题】:Set the content of Label to Image's Tooltip将 Label 的内容设置为 Image 的 Tooltip
【发布时间】:2014-01-16 08:56:35
【问题描述】:

我正在使用 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();
    }
}

工具提示的文本块内容没有改变。但如果我改为:

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

然后它正在工作。但我想传递 lbl02scanning 文本值。为什么它不起作用??

【问题讨论】:

  • lbl02scanning 在哪里声明?在发布的 XAML 中找不到。
  • @RohitVats 形式相同.. 现在更新

标签: c# wpf visual-studio-2010


【解决方案1】:

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

最重要的是Tooltip 和label 不在同一个Visual Tree,因此与elementName 绑定不起作用。但是,您可以使用x:Reference 来获取元素,即使它不存在于同一可视树中。

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

注意 - x:Reference 是在 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

首先将图像标签与标签内容绑定。

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

第三与Tooltip的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>

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

    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;
    }

【讨论】:

  • 它显示“服务提供商缺少名称解析器服务”
  • 更新了更多方法。看看是否有帮助。 :)
【解决方案2】:

试试这个

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多