WPF,动画From不能使用绑定吗?

货郎大叔 2017-06-19 08:17:40

<Grid>
<Button Name="button2" Height="50" Width="100" Content="熊俊" Margin="61,46,356,223"/>
<Button Content="Button" Height="23" HorizontalAlignment="Center" Name="button1" VerticalAlignment="Center" Width="75" >
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Width" From="75" To="150" Duration="0:0:2" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Grid>

上面的代码,对button1的宽度应用动画,代码一切正常,没有报错。
现在把From的值修改为:

From="{Binding ElementName=button2, Path=Width}"

把From的值绑定感到button2的宽度值上,这下就报错了:
无法冻结此 Storyboard 时间线树供跨线程使用。



大神,你知道是什么原因吗,我现在需要在From值上使用绑定。
...全文
964 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
但对于直接定义 Button.Triggers来说,你会发现 只能定义EventTrigger,而不能定义其它类型的trigger,比如:属性trigger,数据trigger。 此时的trigger不是作为资源,而是button可以执行的动作,动作的参数可以自定义也可以是其它(from 是依赖项属性),可能这是WPF对于EventTrigger的一种规范吧。
  • 打赏
  • 举报
回复
可以换个思路理解,style定义的是某个类型的style,targetType 就将它的使用范围限定到这个type类,比如上边的Button,也就是说这个style 对于button来说都可以使用,但是不能引用额外的元素。因为style 是不存在于WPF的逻辑树上的,所以使用Binding的时候会找不到绑定元素,它是作为一种资源嵌入到WPF中。
货郎大叔 2017-06-20
  • 打赏
  • 举报
回复
如果不是在Style中的触发器使用,而是直接使用,却没有问题:

<Grid>
    <Button Name="button1" Height="50" Width="100" Content="熊俊" Margin="61,46,356,223"/>
    <Button Name="button2" Content="Button" Height="23" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <EventTrigger.Actions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width" From="{Binding ElementName=button1, Path=Width}" To="200" Duration="0:0:2" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>
        </Button.Triggers>
    </Button>
</Grid>
哎,这WPF是越来越看不懂了
  • 打赏
  • 举报
回复
引用 4 楼 sr32r345 的回复:
[quote=引用 2 楼 duanzi_peng 的回复:] 可以换个思路理解,style定义的是某个类型的style,targetType 就将它的使用范围限定到这个type类,比如上边的Button,也就是说这个style 对于button来说都可以使用,但是不能引用额外的元素。因为style 是不存在于WPF的逻辑树上的,所以使用Binding的时候会找不到绑定元素,它是作为一种资源嵌入到WPF中。
听起来似乎有道理,但是,你这说法很快就别我推翻了。

<Button Content="熊俊">
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
                            <TextBlock Name="textblock1" Text="AAAAA" Width="50" Height="50"/>
                            <TextBlock Name="textblock2" Grid.Row="1" Text="BBBBB" Width="70" Height="70"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <EventTrigger RoutedEvent="Button.Click">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard TargetName="textblock1">
                                            <DoubleAnimation Storyboard.TargetProperty="Width" To="{Binding ElementName=textblock2, Path=Width}" Duration="0:0:2" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
</Button>
在控件模板中,textblock1的宽度应用动画,To属性值绑定到textblock2的宽度上,这就不会是额外的元素了吧,不会说找不到textblock2元素吧,结果还是收到同样的异常报告: 无法冻结此 Storyboard 时间线树供跨线程使用。 哎,,这WPF是越来越看不懂了哦!!![/quote] https://social.msdn.microsoft.com/Forums/zh-CN/88fccc2d-bd7a-44f5-96aa-5d9c2ff19d43/-storyboard-?forum=wpfzhchs&forum=wpfzhchs
bloodish 2017-06-20
  • 打赏
  • 举报
回复
帮楼主翻了一下stackoverflow, 希望有帮助,如果理解有难度,可以私信我. wpf-animation-binding-to-the-to-attribute-of-storyboard-animation
货郎大叔 2017-06-20
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
可以换个思路理解,style定义的是某个类型的style,targetType 就将它的使用范围限定到这个type类,比如上边的Button,也就是说这个style 对于button来说都可以使用,但是不能引用额外的元素。因为style 是不存在于WPF的逻辑树上的,所以使用Binding的时候会找不到绑定元素,它是作为一种资源嵌入到WPF中。
听起来似乎有道理,但是,你这说法很快就别我推翻了。

<Button Content="熊俊">
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
                            <TextBlock Name="textblock1" Text="AAAAA" Width="50" Height="50"/>
                            <TextBlock Name="textblock2" Grid.Row="1" Text="BBBBB" Width="70" Height="70"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <EventTrigger RoutedEvent="Button.Click">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard TargetName="textblock1">
                                            <DoubleAnimation Storyboard.TargetProperty="Width" To="{Binding ElementName=textblock2, Path=Width}" Duration="0:0:2" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
</Button>
在控件模板中,textblock1的宽度应用动画,To属性值绑定到textblock2的宽度上,这就不会是额外的元素了吧,不会说找不到textblock2元素吧,结果还是收到同样的异常报告: 无法冻结此 Storyboard 时间线树供跨线程使用。 哎,,这WPF是越来越看不懂了哦!!!

111,111

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧