将嵌套的XAML内容压缩为字符串的最佳方法是什么?

时间:2015-04-01 20:57:06

标签: c# wpf 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

1 个答案:

答案 0 :(得分: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,Panel或TextboxBase,它应该为你找到它找到的第一个字符串内容。

在Panel中,无论第一个孩子出现什么,在TextBox基础上它的密码/文本/文档属性都有https://msdn.microsoft.com/en-us/library/bb613548%28v=vs.110%29.aspx#classes_that_contain_arbitrary_content的帮助

我没有对您提供的2个样本进行过深入测试,但这可能是最佳选择。