我对 WPF 相当陌生,并且在用户控件方面遇到了一些困难。
请考虑以下场景:我有一个带有用户控件的 WPF 应用程序,比如说
MySpecialButtonControl
这个“按钮”有两个外观“oldStyle”和“newStyle”(由枚举“AppearanceStyle”指定),它们由名为的依赖属性控制
MyLayoutProperty
回调函数必须执行更改布局的代码。现在这是我想做的事情:我需要在运行时在代码隐藏文件中一次更改此窗口中用户控件的所有(!)实例的外观。
将(例如)属性绑定到 UC 的各个实例,例如
Binding binding = new Binding("AppearanceStyle");
binding.Source = myOptionsClass;
this.myButton.SetBinding(UserControls.MySpecialButtonControl.MyLayoutProperty, binding);
效果很好。但是,我怎样才能直接更改所有 UC 实例的依赖属性,而不必遍历 UC 的集合等?有没有办法在 WPF/C# 中实现这一点?
我试图通过使用样式来解决这个问题,但是在运行时更改所有 UC 本身共享的样式是不可能的,因为它已经在使用中(并且使用这种样式的 UC 已经被绘制)。
接下来,我尝试使用如下样式的动态资源:
<uc:MySpecialButtonControl x:Key="myFakeButton" ></uc:MySpecialButtonControl >
<Style x:Key="myButtonStyle" TargetType="uc:MySpecialButtonControl ">
<Setter Property="MyLayoutProperty" Value="{DynamicResource myFakeButton}"></Setter>
</Style>
这使我可以在运行时更改“myFakeButton”的“MyLayoutProperty”,这是我想要的一半,但即使在谷歌搜索了一段时间后,我仍然找不到将“myFakeButton”的“MyLayoutProperty”绑定到设置器的方法这是我真正需要的。
任何帮助将不胜感激!
更新: 我试图实现迈克尔提供的解决方案,但不幸的是,我得到了以下异常:
PropertyMetadata is already registered for type 'MySpecialButtonControl'.
经过一番谷歌搜索(参见MSDN),我发现 OverrideMetadata 调用应该放在我所做的“MySpecialButtonControl”的静态构造函数中:
static MySpecialButtonControl()
{
DefaultStyleKeyProperty.OverrideMetadata(
typeof(MySpecialButtonControl),
new FrameworkPropertyMetadata(typeof(MySpecialButtonControl)));
}
现在,应用程序编译。现在它完美地工作了。