数据触发器上的自定义工具提示

时间:2014-02-04 14:14:49

标签: wpf wpf-controls tooltip custom-controls

这是我工作提示的XAML代码:

 <DataTrigger Binding="{Binding Visibility,ElementName=txtParent}" Value="Visible">
       <Setter Property="StackPanel.ToolTip" Value="{Binding Text,ElementName=txtParent}" TargetName="PanelTitle">
       </Setter>   
 </DataTrigger>

现在我想要一个具有最大宽度和文字包装的工具提示。我尝试使用以下代码,但它没有用:

 <DataTrigger Binding="{Binding Visibility,ElementName=txtParent}" Value="Visible"> 
     <Setter Property="StackPanel.ToolTip" TargetName="PanelTitle">
           <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToolTip}">
                <StackPanel Margin="7,1">                                               
                   <TextBlock Text="{Binding Text,ElementName=txtParent}"  Margin="1" HorizontalAlignment="Center"                          Width="200"                         TextWrapping='Wrap' VerticalAlignment="Top" />                                               
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
     </Setter>
 </DataTrigger>

1 个答案:

答案 0 :(得分:2)

视觉树中不存在ToolTip,就像您期望的那样。它在运行时不参与继承上下文或“owner”元素的名称范围。我猜你的绑定无法在运行时解析txtParent因为它不知道在哪里看。

您可以尝试使用ElementName=txtParent替换绑定中的Source={x:Reference txtParent},这会强制在解析阶段解析名称,此时名称仍在范围内。它可能有用,也可能没有,但无论哪种方式都可能会破坏XAML设计师。

此外,您要将ToolTip的值设置为ControlTemplate,这没有多大意义。您应该将其设置为ToolTip实例(或其他一些内容类型):

<Setter.Value>
  <ToolTip>
    <StackPanel Margin="7,1" >                                               
      <TextBlock Text="{Binding Text,Source={x:Reference txtParent}}"
                 Margin="1"
                 HorizontalAlignment="Center"
                 Width="200"
                 TextWrapping="Wrap"
                 VerticalAlignment="Top" />
    </StackPanel>
  </ToolTip>
</Setter.Value>

可能工作的另一个方法是将ToolTip作为资源存储在范围内的某个位置,并让Setter为其分配StaticResource引用。通常,使用UI元素作为共享资源是容易出错并被认为是不好的做法,但在应用程序中的任何给定时间只能加载一个ToolTip,它可能会起作用:

<FrameworkElement.Resources>
  <ToolTip x:Key="MyToolTip">
    <StackPanel Margin="7,1" >                                               
      <TextBlock Text="{Binding Text,Source={x:Reference txtParent}}"
                 Margin="1"
                 HorizontalAlignment="Center"
                 Width="200"
                 TextWrapping="Wrap"
                 VerticalAlignment="Top" />
    </StackPanel>
  </ToolTip>
</FrameworkElement.Resources>

<!-- ... -->

<DataTrigger Binding="{Binding Visibility, ElementName=txtParent}"
             Value="Visible">
  <Setter Property="StackPanel.ToolTip"
          Value="{StaticResource MyToolTip}"
          TargetName="PanelTitle" />
</DataTrigger>

但是,如果您正在使用MVVM,那么最简单(也可能是最好的)操作就是将txtParent.Text绑定到视图模型上的属性;然后,您可以使用the technique from this other answer绑定到ToolTip的同一媒体资源。