2015-02-23 60 views
0

我們正在更新我們的庫WPF應用程序,其中包含我們的自定義樣式控件。設計的目的是在這些自定義控件背後顯示XAML,以方便參考,併爲新同事提供指導。如何在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而無需手動輸入字符串。

在此先感謝您的建議!

+2

您是否嘗試使用'XamlWriter.Save'有一個例子(這裏)(http://social.technet.microsoft.com/wiki/contents/articles/ 12345.wpfhowto變頻-控制到XAML和 - 解析-XAML - 進入 - controls.aspx)。 – XAMlMAX 2015-02-23 10:38:39

+0

我試過了,但由於XamlWriter無法序列化泛型類型,並且大部分變通辦法都試圖讓我重寫所有的控件類。這不是我們想要展示XAML的事情。 – 2015-02-24 08:28:51

+0

好的。我只是看着[這篇文章](http://stackoverflow.com/questions/12265981/why-does-a-usercontrol-cause-a-serialization-error),並公平它似乎並不多的工作,如果你只是使用裝飾你的'綁定',除非當然它不是那麼簡單? – XAMlMAX 2015-02-24 10:30:18

回答

2

從XAMIMAX的評論中,您可以使用一個簡單的轉換器將xaml保存爲一個字符串,並使用XamlWriter併爲簡潔起見剝去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> 
+0

減少了XAMLWriter的限制我從XANIMAX獲得了額外的提示。謝謝! – 2015-02-25 09:20:54

相關問題