检测Horizo​​ntalAlignment或VerticalAlignment中的更改

时间:2019-04-06 06:25:31

标签: .net wpf

我喜欢使用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事件。还有其他方法可以检测到此更改吗?

2 个答案:

答案 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/