C# 如何在WPF应用程序中将XAML显示为文本
我们正在更新包含自定义样式控件的gallery WPF应用程序。该设计将有一个切换来显示这些自定义控件背后的XAML,以便于参考,并为新同事提供指南 我目前实现这一点的方法是创建两个.xaml文件,一个只包含控件,一个包含控件,一个包含用于实现这些控件的xaml编码的文本块 这不是很容易维护的,因为引号、>、<和其他字符在XAML字符串中不会转义。这是我现在在其中一个“显示代码”视图中的内容,仅供参考:C# 如何在WPF应用程序中将XAML显示为文本,c#,wpf,xaml,C#,Wpf,Xaml,我们正在更新包含自定义样式控件的gallery WPF应用程序。该设计将有一个切换来显示这些自定义控件背后的XAML,以便于参考,并为新同事提供指南 我目前实现这一点的方法是创建两个.xaml文件,一个只包含控件,一个包含控件,一个包含用于实现这些控件的xaml编码的文本块 这不是很容易维护的,因为引号、>、
<TextBlock Visibility="Collapsed" Margin="5" Text="<controls:AutoCompleteTagBox
Name="AutoCompleteTagBoxWithStrings"
Margin="5"
ItemsSource="{Binding Names}"
FilterMode="Contains" />
<ListBox
ItemsSource="{Binding ElementName=AutoCompleteTagBoxWithStrings, Path=SelectedItems}"
Grid.Column="1"
BorderBrush="{StaticResource Blue}" BorderThickness="1" />"/>
正如您所看到的,它看起来不太好,一旦您更新了其中一个控件,您现在有三个地方需要更改XAML
下一步就是绑定TextBlock可见性并将其从“折叠”切换到“可见”。但是我想知道是否有一种方法可以在文本块中显示XAML,而不必手工编写字符串
提前感谢您的建议 根据XAMIMAX的评论,您可以使用一个简单的转换器将xaml保存为字符串,并为简洁起见删除xmlns名称空间
public class XamlConverter : IValueConverter
{
public readonly Regex xmlnsRegex = new Regex("xmlns=\".+\"");
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var source = value as FrameworkElement;
if (source != null)
{
//Save xaml and strip xmlns namespaces
var xaml = xmlnsRegex.Replace(System.Windows.Markup.XamlWriter.Save(source), "");
return xaml;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
示例用法
<StackPanel>
<StackPanel.Resources>
<converters:XamlConverter x:Key="Converter_Xaml"/>
</StackPanel.Resources>
<Button x:Name="SourceButton" Content="Click Me" Margin="10"/>
<TextBlock Text="{Binding ElementName=SourceButton, Converter={StaticResource Converter_Xaml}}" TextWrapping="Wrap"/>
</StackPanel>
您是否尝试过使用XamlWriter.Save
这里有一个示例。我尝试过,但由于XamlWriter无法序列化泛型类型,而且大多数解决方法都试图让我重新编写所有控件类。我们不想仅仅为了展示XAML而这样做。我刚才看了一下,公平地说,如果你只是在绑定中使用decorator,那似乎不是很多工作,除非它当然不是那么简单?是的,就是这样!谢谢你的帮助!除去对XAMLWriter的限制,我从XANIMAX获得了额外的技巧。谢谢