2014-07-05 73 views
3

說我有一個在XAML像這樣指定的風格ToolTip查找工具提示彈出

<Button Content="Click me" ToolTip="Likes to be clicked"> 
    <Button.Resources> 
     <Style TargetType="{x:Type ToolTip}" BasedOn="{StaticResource {x:Type ToolTip}}"> 
      <Setter Property="OverridesDefaultStyle" Value="true" /> 
      <Setter Property="HasDropShadow" Value="True" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ToolTip}"> 
         <StackPanel Background="Wheat" Height="200" Width="200"> 
          <TextBlock x:Name="TxbTitle" FontSize="24" Text="ToolTip" Background="BurlyWood" /> 
          <ContentPresenter /> 
         </StackPanel> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Button.Resources> 
</Button> 

鑑於我對Button一個參考,而且ToolTip顯示時,我怎麼能找到ToolTipPopup(後來尋找它的視覺兒童,例如TxbTitle)?

更新:

基於pushpraj's答案,我能得到保持的(全)可視化樹,它看起來像這樣:

System.Windows.Controls.Primitives.PopupRoot 
    System.Windows.Controls.Decorator 
    System.Windows.Documents.NonLogicalAdornerDecorator 
     System.Windows.Controls.ToolTip 
     System.Windows.Controls.StackPanel 
      System.Windows.Controls.TextBlock (TxbTitle) 
      System.Windows.Controls.ContentPresenter 
      System.Windows.Controls.TextBlock 
     System.Windows.Documents.AdornerLayer 

在這裏我能找到TxbTitleTextBlock

(這樣的邏輯樹:)不過

System.Windows.Controls.Primitives.Popup 
    System.Windows.Controls.ToolTip 
    System.String 

pushpraj的答案是基於我可以得到ToolTip實例的保持。我得到的僅僅是Button,而Button.ToolTip屬性返回字符串"Likes to be clicked",而不是ToolTip實例。

所以更具體地說,問題是,我可以得到ToolTipPopup的保持在某種程度上,當我的一切是Button

(瘋狂的想法:是有一些方法來枚舉所有打開Popup S')

+0

您想要訪問哪個事件? –

+0

這不是一個事件。我正在研究一個需要信息的「工具」,它正在訪問另一個線程中的元素。但我也對純粹的理解感興趣...... –

回答

8

一個ToolTip是一種Popup哪些主機提示內容

而且因爲彈出窗口在一個單獨的窗口中承載所以它有它自己的邏輯和可視樹

下面的信息是一個提示

視覺和邏輯樹視覺樹

System.Windows.Controls.Primitives.PopupRoot 
    System.Windows.Controls.Decorator 
    System.Windows.Documents.NonLogicalAdornerDecorator 
     System.Windows.Controls.ToolTip 

邏輯樹

System.Windows.Controls.Primitives.Popup 
    System.Windows.Controls.ToolTip 

注:因爲彈出有它自己的根,因此可能無法從主窗口的視覺或邏輯樹訪問。

要查找工具提示

我已經使用附加屬性發現彈出一個提示的彈出

namespace CSharpWPF 
{ 

    public class ToolTipHelper : DependencyObject 
    { 
     public static bool GetIsEnabled(DependencyObject obj) 
     { 
      return (bool)obj.GetValue(IsEnabledProperty); 
     } 

     public static void SetIsEnabled(DependencyObject obj, bool value) 
     { 
      obj.SetValue(IsEnabledProperty, value); 
     } 

     // Using a DependencyProperty as the backing store for IsEnabled. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty IsEnabledProperty = 
      DependencyProperty.RegisterAttached("IsEnabled", typeof(bool), typeof(ToolTipHelper), new PropertyMetadata(false,OnEnable)); 

     private static void OnEnable(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      ToolTip t = d as ToolTip; 

      DependencyObject parent = t; 
      do 
      { 
       parent = VisualTreeHelper.GetParent(parent); 
       if(parent!=null) 
        System.Diagnostics.Debug.Print(parent.GetType().FullName); 
      } while (parent != null); 

      parent = t; 

      do 
      { 
       //first logical parent is the popup 
       parent = LogicalTreeHelper.GetParent(parent); 
       if (parent != null) 
        System.Diagnostics.Debug.Print(parent.GetType().FullName); 
      } while (parent != null); 

     } 
    } 
} 

XAML

<Button Content="Click me" ToolTip="Likes to be clicked"> 
    <Button.Resources> 
     <Style TargetType="{x:Type ToolTip}" BasedOn="{StaticResource {x:Type ToolTip}}" 
       xmlns:l="clr-namespace:CSharpWPF"> 
      <Setter Property="OverridesDefaultStyle" Value="true" /> 
      <Setter Property="HasDropShadow" Value="True" /> 
      <Setter Property="l:ToolTipHelper.IsEnabled" Value="True"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ToolTip}"> 
         <StackPanel Background="Wheat" Height="200" Width="200"> 
          <TextBlock x:Name="TxbTitle" FontSize="24" Text="ToolTip" Background="BurlyWood" /> 
          <ContentPresenter /> 
         </StackPanel> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Button.Resources> 
</Button> 

我已經加入新創建附屬財產提示樣式<Setter Property="l:ToolTipHelper.IsEnabled" Value="True"/>

檢索背後

在事件從代碼的工具提示情況下,你不能從XAML指定的風格樣式或模板,然後後面的代碼是你的檢索工具提示實例的方式

示例代碼

Style style = new Style(typeof(ToolTip), (Style)this.FindResource(typeof(ToolTip))); 
    style.Setters.Add(new Setter(ToolTipHelper.IsEnabledProperty, true)); 
    this.Resources.Add(typeof(ToolTip), style); 

上面的代碼爲工具提示創建了一個樣式對象,併爲ToolTipHelper.IsEnabledProperty添加了一個setter,並將相同的樣式注入到窗口的資源中

因爲當需要顯示工具提示時,屬性更改處理程序OnEnable將在ToolTipHelper類中調用。並且處理程序中的依賴項對象將成爲您可能會進一步處理的實際工具提示實例。

+0

很好的答案(+1),它有助於我的理解。根據您的回答,我已根據調查結果更新了我的問題。但是,您的代碼假設我有權訪問XAML,但不幸的是,我沒有那個luxary ...我對問題的更新。 –

+1

如果你可以通過後面的代碼訪問按鈕或任何父元素,那麼你可以做的是用'l:ToolTipHelper.IsEnabled'的setter將一個工具提示樣式注入到根元素的資源中,並且這會帶來工具提示彈出給你打開它。我在答案中添加了示例代碼。 – pushpraj

+0

不錯的解決方案!謝謝! –