首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在代码中添加元素以控制模板

在代码中添加元素以控制模板
EN

Stack Overflow用户
提问于 2017-03-01 11:23:17
回答 1查看 648关注 0票数 1

假设我有一个通用的UserControl,它具有默认的ControlTemplate。现在,我想添加一个AdornerDecorator作为ControlTemplate的根元素。

我该怎么做?

到目前为止,我的尝试如下:

代码语言:javascript
复制
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有以下xaml:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
public partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        InitializeComponent();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-01 11:59:03

您需要创建模板的副本。您可以使用XamlWriter/XamlReader类克隆现有的模板。

试试这个:

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42530399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档