我喜欢使用this article中描述的控件与装饰者一起工作。我的示例代码如下:
<local:AdornedControl IsAdornerVisible="True"
Margin="60">
<local:AdornedControl.AdornerContent>
<Ellipse Width="50" Height="50"
Stroke="Green"
HorizontalAlignment="Left" />
</local:AdornedControl.AdornerContent>
<ListBox>
<ListBox.Items>
<ListBoxItem Content="Test 1" />
<ListBoxItem Content="Test 2" />
<ListBoxItem Content="Test 3" />
</ListBox.Items>
</ListBox>
</local:AdornedControl>
基本上,这是一个控件,您可以在其中控制XAML中装饰者的视觉效果。这样,您实际上可以在XAML设计窗口中看到装饰者的内容。
使用HorizontalAlignment
中控件的AdornerContent
属性,您可以说装饰器是附加到装饰控件的左侧还是右侧。在我的示例代码中,它附在左侧。
现在,我在示例代码中将HorizontalAlignment
更改为Right
,但是XAML设计窗口中没有任何反应。当我开始示例时,装饰器实际上附着在右侧,然后设计窗口显示装饰器附着在右侧。当改回Left
时,在设计窗口中什么也不会发生,直到我以任何方式更新设计窗口。
我从链接中查看了此AdornedControl
的代码,发现我需要检测HorizontalAlignment
是否已更改,如果更改了,我需要“重画”装饰者的内容。 / p>
最后这是我的问题。如何检测HorizontalAlignment
是否已更改?我在HorizontalAlignmentChanged
中找不到FrameworkElement
事件。还有其他方法可以检测到此更改吗?
答案 0 :(得分:0)
我自己找到了解决方案。除了在不存在的事件中使用“ AddHandler”和“ RemoveHandler”之外,还可以在后面的代码或视图模型代码中使用“ AddValueChanged”和“ RemoveValueChanged”。
要向依赖项属性添加“ ValueChanged”事件处理程序,可以使用:
TypeDescriptor.GetProperties(<FrameWorkElement>)(<Name_Of_Dep_Property>).AddValueChanged(<FrameWorkElement>, <Pointer_To_Event_Handler_Code>)
例如:
TypeDescriptor.GetProperties(Me.TestButton)("HorizontalAlignment").AddValueChanged(Me.TestButton, AddressOf Alignment_ValueChanged)
Private Sub Alignment_ValueChanged(sender As Object, e As EventArgs)
End Sub
要再次删除事件处理程序,只需使用“ RemoveValueChanged”而不是“ AddValueChanged”。
答案 1 :(得分:0)
反思通常不是一个好主意。尝试一下(使用任何依赖项属性):
public MainWindow()
{
InitializeComponent();
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor
.FromProperty(TextBlock.TextProperty, typeof(TextBlock));
if (dpd != null)
{
dpd.AddValueChanged(txtBlock, OnTextChanged);
}
}
private void OnTextChanged(object sender, EventArgs e)
{
MessageBox.Show("The value of the Text property of the TextBlock was changed!");
}
来源:https://blog.magnusmontin.net/2014/03/31/handling-changes-to-dependency-properties/