2010-09-25 10 views
12

मेरे पास निम्न XAML परिभाषित है।डब्लूपीएफ विजुअल ट्रीहेल्पर। गेटपेरेंट गलत वर्ग देता है?

<Popup x:Class="EMS.Controls.Dictionary.MapTip" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    PopupAnimation="Slide" 
    AllowsTransparency="True" Placement="Mouse"  
     x:Name="root"     
     > 

    <Popup.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="../Resources/Styles.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Popup.Resources> 
    <Viewbox x:Name="viewBox" IsHitTestVisible="True"> 
     <Grid Background="Transparent" Name="mainGrid"> 

     </Grid> 
    </Viewbox> 
</Popup> 

अगर मैं दृश्य पेड़ "mainGrid" से VisualTreeHelper.GetParent का उपयोग कर चलना, मैं अंत में System.Windows.Controls.Primitives.PopupRoot मिलता है, लेकिन पॉपअप ही कभी नहीं मिलता है। किसी सिद्धांत के साथ कोई भी क्यों है और मैं इसके बारे में क्या कर सकता हूं? मैं पॉपअप और पॉपअप रूट नहीं जानता।

टीआईए।

+0

यदि आप 'LogicalTreeHelper.GetParent()' का उपयोग करते हैं तो यह काम करता है? –

उत्तर

16

एक पॉपअप में सामग्री एक माता पिता जो PopupRoot है के साथ एक अलग दृश्य पेड़ में जोड़ा जाता है चलने का प्रयास करें, लेकिन आप तार्किक पेड़ सहायक का उपयोग प्राप्त कर सकते हैं इस स्निपेट के साथ पॉपअप:

LogicalTreeHelper.GetParent() 

MSDN से:

जब आप पॉपअप नियंत्रण में सामग्री जोड़ते हैं, तो पॉपअप नियंत्रण सामग्री के लिए तार्किक अभिभावक बन जाता है। इसी प्रकार, पॉपअप सामग्री को पॉपअप का तार्किक बच्चा माना जाता है। बच्चे की सामग्री दृश्य पेड़ में नहीं जोड़ा जाता है जिसमें पॉपअप नियंत्रण होता है। इसके बजाए, बच्चे की सामग्री को एक अलग विंडो में प्रस्तुत किया जाता है जिसमें IsOpen संपत्ति सत्य पर सेट होने पर अपना स्वयं का दृश्य पेड़ होता है।

++

+0

सभी टिप्पणियों के लिए धन्यवाद दोस्तों। –

3

तार्किक पेड़ और नहीं दृश्य पेड़

LogicalTreeHelper.GetParent() 
4

LogicalTreeHelper सबसे अच्छा एक कर सकता है नाम "PopupRoot" GetType().Name से तुलना करने का उपयोग कर प्रयास है और साथ ही पॉपअप तक पहुँचने में असमर्थ है।

+0

यह वही है जो मैंने उपयोग किया था। – Artiom

+0

तार्किक पेड़ में पॉपअप होता है, बस इसे फिर से चलाएं। यह वहाँ है। –

+1

मेरे मामले में, मेरे तार्किक माता-पिता का तार्किक अभिभावक शून्य है। मेरे मामले में, मुझे पॉपअप रूट तक दृश्य पेड़ को पार करना होगा और फिर यह लॉजिकल पेरेंट पॉपअप है। दुर्भाग्य से मैं पॉपअप रूट के माता-पिता की खोज नहीं कर सकता क्योंकि पॉपअप रूट इसके पैकेज में आंतरिक है। साथ ही, विजुअल रूट प्राप्त करने के लिए कोई मौजूदा विधि नहीं है, जो इस मामले में पॉपअप रूट होगा। मैं सिर्फ एक ही स्थिति के लिए विजुअल रूट प्राप्त करने के लिए एक विस्तार विधि नहीं लिखना चाहता हूं। तो मेरे पास वर्तमान में कोई समाधान नहीं है। – Skychan

3

उपयोग करें:

Popup oPopup = VisualHelper.GetLogicalParent<Popup>(oThumb); 

...

public static T GetLogicalParent<T>(DependencyObject p_oElement) 
    where T : DependencyObject 
{ 
    DependencyObject oParent = p_oElement; 
    Type oTargetType = typeof(T); 
    do 
    { 
     oParent = LogicalTreeHelper.GetParent(oParent); 
    } 
    while (
     !(
      oParent == null 
      || oParent.GetType() == oTargetType 
      || oParent.GetType().IsSubclassOf(oTargetType) 
     ) 
    ); 

    return oParent as T; 
} 
1
private void btnRemove_Click(object sender, RoutedEventArgs e) 
    { 

     CloseScatterViewItem((SurfaceButton)sender); 
    } 

    private void CloseScatterViewItem(SurfaceButton button) 
    { 
     DependencyObject parent = button; 
     while ((parent as ScatterViewItem) == null) 
     { 

      // Get the next parent. 
      parent = LogicalTreeHelper.GetParent(parent) != null ? LogicalTreeHelper.GetParent(parent) : VisualTreeHelper.GetParent(parent); 
      ScatterViewItem item = parent as ScatterViewItem; 
      if (item != null) 
      { 
       DependencyObject scatterView = item; 
       while ((scatterView as ScatterView) == null) 
       { 
        scatterView = LogicalTreeHelper.GetParent(scatterView) != null ? LogicalTreeHelper.GetParent(scatterView) : VisualTreeHelper.GetParent(scatterView); 
        ScatterView FoundSV = scatterView as ScatterView; 
        if (FoundSV != null) 
        { 
         //FoundSV.Items.Remove(item); 
         FadeOutAndRemove(FoundSV, item); 
         return; 
        } 
       } 
      } 
     } 

    } 
    public static void FadeOutAndRemove(ScatterView sv, ScatterViewItem svi) 
    { 
     try 
     { 
      svi.Opacity = 1.0; 

      var a = new DoubleAnimation 
      { 
       From = 1.0, 
       To = 0.0, 
       FillBehavior = FillBehavior.Stop, 
       BeginTime = TimeSpan.FromSeconds(0), 
       Duration = new Duration(TimeSpan.FromSeconds(0.5)) 
      }; 

      var storyboard = new Storyboard(); 
      storyboard.Children.Add(a); 

      Storyboard.SetTarget(a, svi); 
      Storyboard.SetTargetProperty(a, new PropertyPath(UIElement.OpacityProperty)); 

      storyboard.Completed += delegate 
      { 
       svi.Visibility = Visibility.Hidden; 
       sv.Items.Remove(svi); 
       svi.Content = null; 
       svi = null; 
      }; 

      storyboard.Begin(); 
     } 
     catch (Exception ex) 
     { 
      //Handle error 

     } 
    } 
2

पर this answer आधार पर और जवाब यहाँ प्रस्तुत है, मैं अंत में इस के साथ आया था:

public static class FindMyParentHelper<T> where T : DependencyObject 
{ 
    public static T FindAncestor(DependencyObject dependencyObject) 
    { 
     while (true) 
     { 
      if (dependencyObject == null) return null; 

      var parent = VisualTreeHelper.GetParent(dependencyObject) ?? 
         LogicalTreeHelper.GetParent(dependencyObject); 

      var parentT = parent as T; 
      if (parentT != null) return parentT; 

      dependencyObject = parent; 
     } 
    } 
} 

जो कभी गलत नहीं होता है और एक के लिए काम करता है नियंत्रण के प्रकार होंगे।

+0

यह निर्भरता फेंकता है जब निर्भरता ऑब्जेक्ट दृश्य या Visual3D नहीं है। आपको बदलना चाहिए ?? वर्तमान के साथ लाइन दृश्य || है वर्तमान Visual3D है? VisualTreeHelper.GetParent (वर्तमान): LogicalTreeHelper.GetParent (वर्तमान); – Wouter

+0

@ वाउटर: क्षमा करें लेकिन यह बकवास है। 'VisualTreeHelper.GetParent' विधि केवल अपवाद फेंकता है जब 'निर्भरता ऑब्जेक्ट' शून्य है। [यहां] देखें (https://docs.microsoft.com/en-us/previous-versions/windows/apps/ms608747 (v = vs.105)) –

+0

लिंक टूटा हुआ लगता है। लेकिन हो सकता है कि आप किसी भी सामग्री के लिए जांच कर सकें जैसे उदाहरण के लिए एक टेक्स्टटेमेंट। – Wouter

संबंधित मुद्दे