如果我在我的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 :(得分: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个样本进行过深入测试,但这可能是最佳选择。