我正在编写一个插件,该插件已加载到源不受我管理的应用程序中。通过 API,我可以获得应用程序的 AvalonDock
DockingManager
。我想添加一个绑定来控制选项卡的颜色。我知道 DataContext
的数据类型,并且可以创建 Binding
来执行我想要的操作。
但是,我希望与原始
DataTemplate
相关的其余绑定和触发器保持不变。我可以从 DataTemplate
获取 DockingManager
,但是一旦应用,它们就会被密封,所以我猜我需要克隆它,修改克隆并应用克隆。
我尝试使用
XamlWriter.Save()
获取模板,但是绑定被从中剥离。如果我在输出上使用 XamlReader.Parse()
,而不进行任何修改,选项卡的文本就会消失。查看xaml,TextBlock.Text
属性是一个空字符串。
我认为应用程序“手动”设置文本,但使用 Visual Studio 检查控件显示在写入/读取过程之前存在绑定。
当模板的创建不受我的控制时,如何在运行时修改模板以添加自定义绑定?
虽然不完全是我问题的直接答案,但我想出的解决方案实际上是修改
Style
而不是 Template
。从 DockingManager
我得到了 LayoutDocumentPaneControl
以及我想要更改的选项卡。我得到了它的 ItemContainerStyle
,制作了一个新的 BasedOn
旧的,并且可以根据需要添加 Setters
,这样除了我试图专门覆盖的内容之外,一切都保持不变。
void OverwriteTabStyle()
{
MultiBinding binding = CreateTabBinding(); //Create the binding to set the background color based on context
var dockingManager = _dockingManagerProvider.GetDockingManager(); //Get access to the DockingManager
var layoutDocumentPaneControl = dockingManager.FindVisualChildren<LayoutDocumentPaneControl>().FirstOrDefault();
Style oldStyle = layoutDocumentPaneControl.ItemContainerStyle;
Style newStyle = new Style(typeof(TabItem), oldStyle);
newStyle.Setters.Add(new Setter(Panel.BackgroundProperty, binding)); //Only modifies single property while maintaining other Bindings
newStyle.Seal();
layoutDocumentPaneControl.ItemContainerStyle = newStyle;
}