2017-03-01 50 views
1

比方說,我有一個共同的UserControl,它的默認值爲ControlTemplate。現在我想添加一個AdornerDecorator作爲ControlTemplate的根元素。在代碼中添加元素以控制模板

我該怎麼做?

我嘗試到目前爲止是這樣的:

UserControl view; 
var templateWithAdornerDecorator = new ControlTemplate(view.GetType()); 
var adornerDecorator = new FrameworkElementFactory(typeof(AdornerDecorator)); 
var otherView = new FrameworkElementFactory(view.GetType()); 
otherView.SetValue(Control.TemplateProperty, view.Template); 
adornerDecorator.AppendChild(otherView); 
templateWithAdornerDecorator.VisualTree = adornerDecorator; 
view.Template = templateWithAdornerDecorator; 

(我view可能是一個派生類型的UserControl的。) 但是以StackOverflowException :(

編輯崩潰: MyUserControl has this xaml:

<UserControl x:Class="MyNameSpace.Wpf.Sample.MyUserControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    ABA 
</UserControl> 

並且這是xaml.cs:

public partial class MyUserControl : UserControl 
{ 
    public MyUserControl() 
    { 
     InitializeComponent(); 
    } 
} 

回答

1

您需要創建模板的副本。您可以使用XamlWriter/XamlReader類來克隆現有模板。

試試這個:

MyUserControl view = new MyUserControl(); 
string xaml; 
ControlTemplate ct = view.Template; 
using (var stream = new System.IO.MemoryStream()) 
{ 
    System.Windows.Markup.XamlWriter.Save(ct, stream); 
    xaml = Encoding.ASCII.GetString(stream.ToArray()); 
} 

XNamespace ns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; 
XDocument oldTemplateXml = XDocument.Parse(xaml); 
XElement newTemplateXml = new XElement(ns + "ControlTemplate", 
new XElement(ns + "AdornerDecorator", oldTemplateXml.Root.DescendantNodes().First())); 

ControlTemplate newTemplate = System.Windows.Markup.XamlReader.Parse(newTemplateXml.ToString()) as ControlTemplate; 
view.Template = newTemplate; 
+0

能否請您試試這個代碼,用'MyUserControl'是從'UserControl'派生類中有自己的XAML。我得到一個'System.Xml.XmlException',其消息如**':'char,十六進制值0x3A,不得包含**。 –

+0

然後請發佈UserControl的完整XAML標記。 – mm8

+0

您提供的示例標記是無效的,但是如果您將「ABA」放在TextBlock中,我的示例代碼就可以工作。 – mm8

相關問題