来自UIElement的值更改后执行方法

时间:2013-03-13 17:34:51

标签: c# wpf animation uielement

是否可以在WPF中订阅特定UIElement的属性?

我想在高度值更改后立即为UIElement设置动画并将新高度添加到列表中,但我看不到如何订阅HeightProperty?

Samplecode:

这样的事情:

MainWindow.xaml:

<Window x:Class="BibVisualization.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <Border Background="Red" Width="30" Grid.Row="0" x:Name="myBorder">
        <TextBlock Text="Really really long text with wrapping, but the wrapping changes based on border's width"
               Width="{Binding ElementName=myBorder, Path=Width}"
               TextWrapping="Wrap" />
    </Border>
    <Button Grid.Row="1" Height="10" 
        Content="Make border bigger" Click="OnButtonClick" />
</Grid>
</Window>

MainWindow.xaml.cs

private void OnButtonClick(Object sender, RoutedEventArgs e)
{
    myBorder.Width += 10;
    //Bind to textblock's actualheight and execute OnHeightChange?
}

private int accumulatedChange;

private void OnHeightChange(Object sender, SomeEventArgs? e)
{
    accumulatedChange -= e.OldValue (if possible);
    accumulatedChange += e.NewValue;
}

3 个答案:

答案 0 :(得分:0)

我认为您可以使用FrameworkElement类的SizeChanged - 事件来执行您想要的操作。 UIElementButton之类的所有Textblock都来自该类,因此会提供该事件。

传递给已注册方法的SizeChangedEventArgs包含高度或宽度已更改的信息并提供新值。

答案 1 :(得分:0)

您可以使用DependencyPropertyDescriptor为属性添加ValueChangedHandler

DependencyPropertyDescriptor descriptor=DependencyPropertyDescriptor.FromProperty(UIElement.HeightProperty,typeof(UIElement));
descriptor.AddValueChanged(myUIElementToWatch, new EventHandler(OnHeightOfUiElementChanged));

答案 2 :(得分:0)

如果我理解正确,你想要'绑定'ActualHeight

看一下这个链接(http://meleak.wordpress.com/2011/08/28/onewaytosource-binding-for-readonly-dependency-property/) - 它描述了如何使用附加属性基本完成它。

从前几天看看我的这个答案,基本上描述了非常相似的问题 https://stackoverflow.com/a/15367642/417747
(使用链接下载支持代码 - 您可以通过Style或文章中描述的方式绑定 - 这是类似的事情)

您需要使用本文中描述的方法绑定到ActiveHeight,该方法会更改您的视图模型的MyHeight属性 - 处理它时set以获取活动时身高变化。如果有任何问题,请告诉我。

希望它有所帮助。