【问题标题】:Templated FrameworkElement impossible to modify from code behind模板化的 FrameworkElement 无法从后面的代码中修改
【发布时间】:2021-05-14 14:05:33
【问题描述】:

上下文

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

我通过我在这里找到的这段代码得到了想要的 FrameworkElement:Access control in style from code

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。

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

【问题讨论】:

  • LoadContent() 基于模板创建新元素。你想改变什么特定元素的外观?
  • 好吧,如果不发布大量代码,很难准确地说出来,但如果它创建一个新实例,这就解释了为什么我的修改对程序没有任何改变。你知道我怎样才能得到应用到myTemplatedButton的样式中定义的实际“SliderButton_ButtonControl”吗?
  • 请看我的回答。

标签: c# wpf xaml code-behind frameworkelement


【解决方案1】:

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

如果你想修改一个已有的元素,你应该调用这个模板的FindName方法:

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

【讨论】:

  • 我在 FrameworkElement 中找不到“模板”之类的东西
  • 我认为myTemplatedButtonButton。不是吗?将其投射到 ControlButton。只有控件有模板,所以这应该是安全的。
  • ((Control)myTemplatedButton).Template.FindName(...)
  • 我试过这个并意识到我在第一行的 LoadContent() 并没有返回按钮,而是样式本身的主网格,使用 Ellipse ellipse = this.Template.FindName("SliderButton_ButtonControl", this) as Ellipse; 修复了它,谢谢!
猜你喜欢
  • 2014-02-04
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多