亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

故事板的數據觸發器未觸發

故事板的數據觸發器未觸發

C#
素胚勾勒不出你 2023-09-24 17:07:27
我在同一個圖像上有 5 個不同的 DataTrigger,每個都用于相同的 Binding,但具有不同的值,每個將圖像旋轉不同的角度。每次更改該值后,該值都會重置為 0。當我沒有添加該DataTrigger.ExitActions> <RemoveStoryboard>東西時,它們工作了一次,但它們只工作了一次,所以如果steps綁定再次獲得這個值,它們就不會觸發。<Image x:Name="drehteller" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5" Source="{Binding drehteller_image}">        <Image.RenderTransform>            <RotateTransform/>        </Image.RenderTransform>        <Image.Style>            <Style>                <Style.Triggers>                    <DataTrigger Binding="{Binding steps}" Value="1">                        <DataTrigger.EnterActions>                            <BeginStoryboard x:Name="Storyboard1Step">                                <Storyboard>                                    <DoubleAnimation                                        Storyboard.TargetProperty="RenderTransform.Angle"                                         By="72"                                        Duration="00:00:00:03"                                    />                                </Storyboard>                            </BeginStoryboard>也許有人知道我做錯了什么,我認為這RemoveStoryboard可能會解決他們只解雇一個的問題,但看起來他們沒有。編輯:發現如果沒有,ExitActions我可以根據需要多次觸發值 1 的觸發器,只要值永遠不會高于 1,所以如果我一旦觸發值 2 的觸發器,值 1 的觸發器將不會不再工作,如果我使用值 3 觸發觸發器,則值 2 的觸發器將不再工作。等等,猜猜你已經明白了。
查看完整描述

2 回答

?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

一個非常簡單直接的解決方案是在后面的代碼中運行動畫:


var viewModel = new ViewModel();


viewModel.PropertyChanged += (s, e) =>

{

    if (e.PropertyName == nameof(viewModel.Steps))

    {

        drehteller.RenderTransform.BeginAnimation(

            RotateTransform.AngleProperty,

            new DoubleAnimation

            {

                By = viewModel.Steps * 72,

                Duration = TimeSpan.FromSeconds(3)

            });

    }

};


DataContext = viewModel;

這與 MVVM 并不矛盾,因為視圖模型仍然對視圖一無所知。這是一個純粹的視圖方面。


查看完整回答
反對 回復 2023-09-24
?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

您還可以使用附加行為來完成此操作。這些是可重用的視圖邏輯,您可以將它們附加到各種 UI 元素,而無需將它們放在代碼隱藏中。

您將需要Microsoft.Xaml.Behaviors.Wpf NuGet 包(這曾經作為 Visual Studio 的“Blend for Visual Studio SDK for .NET”組件的一部分進行分發,但在 VS 2019 中發生了變化)。

定義你的行為。請注意,AssociatedObject指的是Image與此行為相關的 ,請參見下文。

public class AnimateBehavior : Behavior<Image>

{

? ? public int Steps

? ? {

? ? ? ? get => (int)GetValue(StepsProperty);

? ? ? ? set => SetValue(StepsProperty, value);

? ? }

? ? public static readonly DependencyProperty StepsProperty =

? ? ? ? DependencyProperty.Register(nameof(Steps), typeof(int), typeof(AnimateBehavior), new PropertyMetadata(0, (d, e) => ((AnimateBehavior)d).StepsChanged(e)));


? ? private void StepsChanged(DependencyPropertyChangedEventArgs e)

? ? {

? ? ? ? if (AssociatedObject == null)

? ? ? ? ? ? return;


? ? ? ? AssociatedObject.RenderTransform.BeginAnimation(

? ? ? ? ? ? RotateTransform.AngleProperty,

? ? ? ? ? ? new DoubleAnimation()

? ? ? ? ? ? {

? ? ? ? ? ? ? ? By = (int)e.NewValue * 72,

? ? ? ? ? ? ? ? Duration = TimeSpan.FromSeconds(3),

? ? ? ? ? ? });

? ? }

}

然后在您的 XAML 中,您將需要此命名空間:


xmlns:behaviors="http://schemas.microsoft.com/xaml/behaviors"

然后:


<Image ...>

? ? <Image.RenderTransform>

? ? ? ? <RotateTransform/>

? ? </Image.RenderTransform>

? ? <behaviors:Interaction.Behaviors>

? ? ? ? <local:AnimateBehavior Steps="{Binding steps}"/>

? ? </behaviors:Interaction.Behaviors>

</Image>


查看完整回答
反對 回復 2023-09-24
  • 2 回答
  • 0 關注
  • 172 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號