2017-03-01 12 views
1

私が共通のUserControlを持っていて、それがデフォルトのControlTemplateになっているとします。ここでControlTemplateのルート要素としてAdornerDecoratorを追加します。コードで制御テンプレートに要素を追加します

どうすればいいですか?

次私のこれまでの試みです:

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; 

(マイviewUserControlの派生型である可能性があります。) しかし、それでStackOverflowException :(

EDITでクラッシュ: MyUserControlこの中には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'は独自のXAMLとUserControl''から派生したクラスであることで、このコードを試してみてくださいでした:

はこれを試してみてください。私は 'System.Xml.XmlException'を**のようなメッセージで取得します。 ':' char、16進数値0x3Aは含まれてはいけません**。 –

+0

その後、UserControlのXAMLマークアップを投稿してください。 – mm8

+0

あなたが提供したサンプルマークアップは無効ですが、私のサンプルコードがTextBlockに "ABA"を入れても問題ありません。 – mm8

関連する問題