首页 > 解决方案 > 模板化的 FrameworkElement 无法从后面的代码中修改

问题描述

语境

我有一个重新定义在 FrameworkElement 上应用的 ControlTemplate 的样式。在给定事件上,我希望能够修改 ControlTemplate 内容的某些属性(来自后面的代码,而不是绑定)。

我在这里找到的这段代码需要FrameworkElement:来自代码的样式访问控制

FrameworkElement myTemplatedButton = this.Template.LoadContent() as FrameworkElement;
Ellipse ellipse = myTemplatedButton.FindName("SliderButton_ButtonControl") as Ellipse;

这似乎找到了我正在寻找的元素,因为我没有收到任何错误并且参考设置正确。

问题

但是,当我尝试像这样更新属性时

ellipse.Fill = Brushes.Red;
ellipse.Visibility = Visibility.Hidden;

我的应用程序没有任何变化,如果我在重新触发事件之前在代码中放置断点,我可以看到 Property Visibility(例如)已重置为 Visibility.Visible。

这就像应用程序在函数返回后立即覆盖我的更改,而我不知道为什么。

标签: c#wpfxamlcode-behindframeworkelement

解决方案


LoadContent()基于模板创建新元素。

如果要修改现有元素,则应调用FindName此模板的方法:

Ellipse ellipse = myTemplatedButton.Template
    .FindName("SliderButton_ButtonControl", myTemplatedButton) as Ellipse;

推荐阅读