2017-03-01 1 views
1

Disons que j'ai un UserControl commun qui a par défaut ControlTemplate. Maintenant, je veux ajouter un AdornerDecorator en tant qu'élément racine du ControlTemplate.Ajouter un élément pour contrôler le modèle dans le code

Comment est-ce que je ferais cela?

Ma tentative à ce jour est la suivante:

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; 

(Mon view pourrait être d'un type dérivé de UserControl.) Mais que les accidents avec StackOverflowException :(

EDIT: MyUserControl a ce 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> 

et ceci est le xaml.cs:

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

Répondre

1

Vous devez créer une copie du modèle. Vous pouvez cloner le modèle existant en utilisant les classes XamlWriter/XamlReader.

Essayez ceci:

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

Pourriez-vous s'il vous plaît essayer ce code, avec 'MyUserControl' étant une classe dérivée de' UserControl' avec son propre XAML. Je reçois une 'System.Xml.XmlException' avec un message comme ** Le caractère ':', valeur hexadécimale 0x3A, ne doit pas être contenu **. –

+0

Veuillez ensuite publier le balisage XAML complet de UserControl. – mm8

+0

L'exemple de balisage que vous avez fourni est invalide, mais si vous mettez "ABA" dans un TextBlock, mon exemple de code fonctionne. – mm8