【问题标题】:Something is wrong with DataTrigger and StoryboardDataTrigger 和 Storyboard 有问题
【发布时间】:2018-05-31 22:29:13
【问题描述】:

我已经尝试了 4 天,请帮助我。

我有一个故事板,一切都很好,直到我需要将触发操作从按钮单击更改为绑定布尔变量。 这一切都写在一个模板中,我想这会使任务变得更加复杂。 代码是(它仍然有效):

    <Border x:Name="panelControl" Grid.RowSpan="4" Margin="0,0,-450,0" VerticalAlignment="Stretch" HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" Width="450" Height="275" DataContext="{Binding CurrentPanelViewModel}" >
            <Border.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform/>
                </TransformGroup>
            </Border.RenderTransform>

                <Canvas Background="#FFC6E8E6">
                    ...
                </Canvas>
            </Grid>
        </Border>

    <Grid.Triggers>
            <EventTrigger RoutedEvent="Button.Click" SourceName="AddButton2">
                <BeginStoryboard Name="StartStoryboard">
                    <Storyboard SpeedRatio="12" TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
                        <DoubleAnimation 
                            Storyboard.TargetName="panelControl" 
                            Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"
                            Duration="0:0:005" From="0" To="-700" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>

现在我写了。

<Border x:Name="panelControl" Grid.RowSpan="4" Margin="0,0,-450,0" VerticalAlignment="Stretch" HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" Width="450" Height="275" DataContext="{Binding Path=Controller.LegViewModel.CurrentPanelViewModel}" >
            <Border.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform/>
                </TransformGroup>
            </Border.RenderTransform>

            <Grid.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path = PanelOpened}">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard >
                                        <Storyboard SpeedRatio="12" TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
                                            <DoubleAnimation
                                                Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"
                                                Duration="0:0:005" From="0" To="-700" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.EnterActions>

                                <!--<DataTrigger.ExitActions>
                                     you could animate close too if you wanted 
                                </DataTrigger.ExitActions>-->
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Grid.Style>

                <Canvas Background="#FFC6E8E6">
                    ....
                </Canvas>
            </Grid>
        </Border>

然后什么也没有发生。尽管我检查了 PanelOpened 通知。

---------更新-----------

我将 Value="True" 添加到 DataTrigger,现在我的 OnPropertyChanged 出现错误(当 propertyName = PanelOpened 时):

public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        //если PropertyChanged не нулевое - оно будет разбужено
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public bool PanelOpened
    {
        get { return _panelOpened; }
        set
        {
            _panelOpened = value;
            OnPropertyChanged();
        }
    }

错误: System.InvalidOperationException:“[Unknown]”属性未指向路径“(0).(1)[3].(2)'中的 DependencyObject。”

【问题讨论】:

    标签: c# wpf storyboard datatrigger


    【解决方案1】:

    当绑定的值等于您指定的某个值时触发数据触发器。但是您没有指定值。如果您希望触发器在PanelOpened 的值更改为 true 时“触发”,请这样说:

    <DataTrigger Binding="{Binding PanelOpened}" Value="True">
    

    【讨论】:

    • 发布您的实际 XAML,而不是问题中的损坏内容。我必须修复它来测试它。
    【解决方案2】:

    问题是我尝试将 DataTrigger 添加到 Grid 样式而不是 Border。工作版本:

                <Border.Style>
                    <Style TargetType="{x:Type Border}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path = PanelOpened}" Value="True">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard >
                                        <Storyboard SpeedRatio="12" TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
                                            <DoubleAnimation
                                                Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"
                                                Duration="0:0:005" From="0" To="-700" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.EnterActions>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
    

    【讨论】:

    • 有道理。这就是我将其更改为进行测试的内容。
    猜你喜欢
    • 2016-08-07
    • 2016-06-18
    • 2019-11-10
    • 1970-01-01
    • 2020-09-11
    • 2016-03-19
    • 1970-01-01
    • 2018-07-04
    • 2015-04-29
    相关资源
    最近更新 更多