2015-04-01 47 views
0

如果我有這在我的XAML:將嵌套XAML內容平鋪到字符串的最佳方式是什麼?

<Button Name="MyButton" Content="Hello" /> 

然後,我可以看到的MyButton.Content.ToString()Hello

但是,如果我有我的XAML是這樣的:

<Button Name="MyButton"> 
    <StackPanel> 
     <Label Content="Hello" /> 
    </StackPanel> 
</Button> 

然後突然MyButton.Content.ToString()System.Windows.Control.StackPanel

什麼是有效「扁平化」FrameworkElement內容並查看實際文本內容的最佳方式?因此,在第二種情況下,它應該像第一種情況一樣返回Hello

+0

要麼命名內部標籤以便它可以被訪問,要麼您必須編寫一個可以檢查每種控件類型的遞歸解析器。你能解釋爲什麼你需要這個嗎?可能有助於尋找其他解決方案。 – kidshaw 2015-04-01 21:08:44

回答

1

遞歸

string fetchContentString(object o) 
     { 
      if (o == null) 
      { 
       return null; 
      } 

      if(o is string) 
      { 
       return o.ToString(); 
      } 

      if(o is ContentControl) //Button ButtonBase CheckBox ComboBoxItem ContentControl Frame GridViewColumnHeader GroupItem Label ListBoxItem ListViewItem NavigationWindow RadioButton RepeatButton ScrollViewer StatusBarItem ToggleButton ToolTip UserControl Window 
      { 
       var cc = o as ContentControl; 

       if (cc.HasContent) 
       { 
        return fetchContentString(cc.Content); 
       } 
       else 
       { 
        return null; 
       } 

      } 

      if(o is Panel) //Canvas DockPanel Grid TabPanel ToolBarOverflowPanel ToolBarPanel UniformGrid StackPanel VirtualizingPanel VirtualizingPanel WrapPanel 
      { 
       var p = o as Panel; 
       if (p.Children != null) 
       { 
        if (p.Children.Count > 0) 
        { 
         if(p.Children[0] is ContentControl) 
         { 
          return fetchContentString((p.Children[0] as ContentControl).Content); 
         }else 
         { 
          return fetchContentString(p.Children[0]); 
         } 
        } 
       } 
      } 

      //Those are special 
      if(o is TextBoxBase) // TextBox RichTextBox PasswordBox 
      { 
       if(o is TextBox) 
       { 
        return (o as TextBox).Text; 
       } 
       else if(o is RichTextBox) 
       { 
        var rt = o as RichTextBox; 
        if (rt.Document == null) return null; 
        return new TextRange(rt.Document.ContentStart, rt.Document.ContentEnd).Text; 
       } 
       else if(o is PasswordBox) 
       { 
        return (o as PasswordBox).Password; 
       } 
      } 

      return null; 
     } 

給它一個ContentControl中,面板或TextboxBase,它應該給你找到的第一個字符串的內容。

的面板中

其無論第一個孩子導致,在文本框底座的密碼/文字/文檔屬性與https://msdn.microsoft.com/en-us/library/bb613548%28v=vs.110%29.aspx#classes_that_contain_arbitrary_content

一些幫助,我沒有測試過深深的只是你所提供的2個樣品,但多數民衆贊成可能是要走的路。

相關問題