Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF应用程序中将XAML显示为文本_C#_Wpf_Xaml - Fatal编程技术网

C# 如何在WPF应用程序中将XAML显示为文本

C# 如何在WPF应用程序中将XAML显示为文本,c#,wpf,xaml,C#,Wpf,Xaml,我们正在更新包含自定义样式控件的gallery WPF应用程序。该设计将有一个切换来显示这些自定义控件背后的XAML,以便于参考,并为新同事提供指南 我目前实现这一点的方法是创建两个.xaml文件,一个只包含控件,一个包含控件,一个包含用于实现这些控件的xaml编码的文本块 这不是很容易维护的,因为引号、>、

我们正在更新包含自定义样式控件的gallery WPF应用程序。该设计将有一个切换来显示这些自定义控件背后的XAML,以便于参考,并为新同事提供指南

我目前实现这一点的方法是创建两个.xaml文件,一个只包含控件,一个包含控件,一个包含用于实现这些控件的xaml编码的文本块

这不是很容易维护的,因为引号、>、<和其他字符在XAML字符串中不会转义。这是我现在在其中一个“显示代码”视图中的内容,仅供参考:

<TextBlock Visibility="Collapsed" Margin="5" Text="&lt;controls:AutoCompleteTagBox&#10;
           Name=&quot;AutoCompleteTagBoxWithStrings&quot;&#10;
           Margin=&quot;5&quot;&#10;
           ItemsSource=&quot;{Binding Names}&quot;&#10;
           FilterMode=&quot;Contains&quot; /&gt;&#10;
           &lt;ListBox&#10;
           ItemsSource=&quot;{Binding ElementName=AutoCompleteTagBoxWithStrings, Path=SelectedItems}&quot;&#10;
           Grid.Column=&quot;1&quot;&#10;
           BorderBrush=&quot;{StaticResource Blue}&quot; BorderThickness=&quot;1&quot; /&gt;"/>

正如您所看到的,它看起来不太好,一旦您更新了其中一个控件,您现在有三个地方需要更改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获得了额外的技巧。谢谢