wpf交换路径属性具有枚举,然后动画启动时失败
我想制作一个自定义按钮控件,可以通过在主呼叫上分配的枚举属性进行更改。
因此,我还针对此可切换按钮实现了动画激活,该按钮在激活时将动画作为流动颜色开始。
但是,当我启动动画时,它会失败,因为我想更改名称的动画属性就不会在此处建立。
在MomeNMT上有两种样式进行测试,如果我仅定义自定义的动画和样式,它可以工作,但是当我尝试在动画触发时尝试添加第二种动画和样式时,它会失败。你能帮我吗?
这是我的代码;
这是generic.xaml,
<!-- Komut Butonlari -->
<Style TargetType="{x:Type local:KomutButonlari}">
<Setter Property="VerticalAlignment"
Value="Top"/>
<Setter Property="HorizontalAlignment"
Value="Left"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:KomutButonlari}">
<Border x:Name="Sinir"
CornerRadius="50"
BorderThickness="0"
BorderBrush="Transparent">
<Border.Background>
<LinearGradientBrush EndPoint="1,1"
StartPoint="0,1">
<GradientStop Color="#FF6ff7e8"
Offset="0"/>
<GradientStop Color="#FF1f7ea1"
Offset="1"/>
</LinearGradientBrush>
</Border.Background>
<Path x:Name="Ucgen">
<Path.Style>
<Style TargetType="Path">
<Style.Triggers>
<!-- Baslama Sekli -->
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:KomutButonlari}}, Path=Stil}" Value="Baslama">
<Setter Property="Data" Value="M 25 20 L 85 50 25 80 Z"/>
<Setter Property="Stroke" Value="#9928AF23"/>
<Setter Property="StrokeLineJoin" Value="Round"/>
<Setter Property="StrokeThickness" Value="4"/>
<Setter Property="Fill">
<Setter.Value>
<LinearGradientBrush EndPoint="1,1"
StartPoint="0,1">
<GradientStop Color="#FF28AF23"
Offset="0"/>
<GradientStop x:Name="BaslamaOtelemesi"
Color="#FF28AF23"
Offset="0"/>
<GradientStop x:Name="BaslamaOtelemesi1"
Color="WhiteSmoke"
Offset="0"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:KomutButonlari}}, Path=Stil}" Value="Durdurma">
<Setter Property="Data" Value="M 25 20 L 45 20 45 80 25 80 Z M 55 20 L 75 20 75 80 55 80 Z"/>
<Setter Property="Stroke" Value="#E08A10"/>
<Setter Property="StrokeLineJoin" Value="Round"/>
<Setter Property="StrokeThickness" Value="4"/>
<Setter Property="Fill">
<Setter.Value>
<LinearGradientBrush EndPoint="1,1"
StartPoint="0,1">
<GradientStop Color="#E08A10"
Offset="0"/>
<GradientStop x:Name="DurdurmaOtelemesi"
Color="#E08A10"
Offset="0"/>
<GradientStop x:Name="DurdurmaOtelemesi1"
Color="WhiteSmoke"
Offset="0"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Path.Style>
</Path>
</Border>
<ControlTemplate.Triggers>
<!-- Baslama Butonu -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Aktif" Value="True"/>
<Condition Property="Stil" Value="Baslama"/>
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<BeginStoryboard x:Name="BaslamaAnimasyonu">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="BaslamaOtelemesi"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
<DoubleAnimation Storyboard.TargetName="BaslamaOtelemesi1"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
</Storyboard>
</BeginStoryboard>
</MultiTrigger.EnterActions>
<MultiTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="BaslamaAnimasyonu"/>
</MultiTrigger.ExitActions>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Aktif" Value="True"/>
<Condition Property="Stil" Value="Durdurma"/>
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<BeginStoryboard x:Name="DurdurmaAnimasyonu">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="DurdurmaOtelemesi"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
<DoubleAnimation Storyboard.TargetName="DurdurmaOtelemesi1"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
</Storyboard>
</BeginStoryboard>
</MultiTrigger.EnterActions>
<MultiTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="DurdurmaAnimasyonu"/>
</MultiTrigger.ExitActions>
</MultiTrigger>
<!--<Trigger Property="Aktif" Value="True">
<Trigger.EnterActions>
<BeginStoryboard x:Name="AktiflikAnimasyonu">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="KaydirmaOtelemesi"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
<DoubleAnimation Storyboard.TargetName="KaydirmaOtelemesi1"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
</Trigger.ExitActions>
</Trigger>-->
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这是背后的代码;
public class KomutButonlari : ButtonBase
{
static KomutButonlari()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(KomutButonlari), new FrameworkPropertyMetadata(typeof(KomutButonlari)));
}
public enum KomutSinifi
{
Baslama,
Durdurma,
Reset,
HataSilme
}
public KomutSinifi Stil
{
get { return (KomutSinifi)GetValue(StilProperty); }
set { SetValue(StilProperty, value); }
}
// Using a DependencyProperty as the backing store for Stil. This enables animation, styling, binding, etc...
public static readonly DependencyProperty StilProperty =
DependencyProperty.Register("Stil", typeof(KomutSinifi), typeof(KomutButonlari), new PropertyMetadata(KomutSinifi.Baslama));
public bool Aktif
{
get { return (bool)GetValue(AktifProperty); }
set { SetValue(AktifProperty, value); }
}
// Using a DependencyProperty as the backing store for Aktif. This enables animation, styling, binding, etc...
public static readonly DependencyProperty AktifProperty =
DependencyProperty.Register("Aktif", typeof(bool), typeof(KomutButonlari), new PropertyMetadata(false));
}
这是我打电话的方式;
<StackPanel Grid.Row="3" Grid.ColumnSpan="3" Orientation="Horizontal">
<nesne:KomutButonlari Aktif="{Binding Test1, Mode=TwoWay}" Width="100" Height="100" Margin="10" Stil="Baslama" Click="Button_Click"/>
<nesne:KomutButonlari Aktif="{Binding Test1, Mode=TwoWay}" Width="100" Height="100" Margin="10" Stil="Durdurma"/>
</StackPanel>
以及后面的主窗口代码;
private void Button_Click(object sender, RoutedEventArgs e)
{
Test1 = !Test1;
}
要获得故障,您需要单击一次到按钮以更改trig属性以启动动画。
任何IDEAD都可以一次实现这两种样式吗?
更新:
解决方案在下面,
更改Storyboard.targetName =“ Baslamaotelemesi”到Storyboard.targetProperty =“ fill。还要与条件进行多比较,我只需更改为
MultidatatRigger
而不是dataTrigger
。
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:KomutButonlari}}, Path=Stil}" Value="Baslama">
<Setter Property="Data" Value="M 25 20 L 85 50 25 80 Z"/>
<Setter Property="Stroke" Value="#9928AF23"/>
<Setter Property="StrokeLineJoin" Value="Round"/>
<Setter Property="StrokeThickness" Value="4"/>
<Setter Property="Fill">
<Setter.Value>
<LinearGradientBrush EndPoint="1,1"
StartPoint="0,1">
<GradientStop Color="#FF28AF23"
Offset="0"/>
<GradientStop Color="#FF28AF23"
Offset="0"/>
<GradientStop Color="WhiteSmoke"
Offset="0"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:KomutButonlari}}, Path=Stil}" Value="Baslama"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:KomutButonlari}}, Path=Aktif}" Value="True"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard x:Name="BaslamaAnimasyonu">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetProperty="Fill.(GradientBrush.GradientStops)[1].(GradientStop.Offset)"
To="1"
Duration="0:0:0:3"/>
<DoubleAnimation Storyboard.TargetProperty="Fill.(GradientBrush.GradientStops)[2].(GradientStop.Offset)"
To="1"
Duration="0:0:0:3"/>
</Storyboard>
</BeginStoryboard>
</MultiDataTrigger.EnterActions>
<MultiDataTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="BaslamaAnimasyonu"/>
</MultiDataTrigger.ExitActions>
</MultiDataTrigger>
I would like to make a custom button control which can be change with an enum property that assigned on main call.
So i have implemented additionally an animation activation to this switchable button that start the animation as flowing color when activated.
But when i start the animation it fails as animation property that i want to change name is not founded here.
There is two style at the momemnt for testing, it works if i only define self defined animation and style, but when i try to add second one when animation triggered it fails. Could you please help me about it?
Here is my code;
This is Generic.xaml
<!-- Komut Butonlari -->
<Style TargetType="{x:Type local:KomutButonlari}">
<Setter Property="VerticalAlignment"
Value="Top"/>
<Setter Property="HorizontalAlignment"
Value="Left"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:KomutButonlari}">
<Border x:Name="Sinir"
CornerRadius="50"
BorderThickness="0"
BorderBrush="Transparent">
<Border.Background>
<LinearGradientBrush EndPoint="1,1"
StartPoint="0,1">
<GradientStop Color="#FF6ff7e8"
Offset="0"/>
<GradientStop Color="#FF1f7ea1"
Offset="1"/>
</LinearGradientBrush>
</Border.Background>
<Path x:Name="Ucgen">
<Path.Style>
<Style TargetType="Path">
<Style.Triggers>
<!-- Baslama Sekli -->
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:KomutButonlari}}, Path=Stil}" Value="Baslama">
<Setter Property="Data" Value="M 25 20 L 85 50 25 80 Z"/>
<Setter Property="Stroke" Value="#9928AF23"/>
<Setter Property="StrokeLineJoin" Value="Round"/>
<Setter Property="StrokeThickness" Value="4"/>
<Setter Property="Fill">
<Setter.Value>
<LinearGradientBrush EndPoint="1,1"
StartPoint="0,1">
<GradientStop Color="#FF28AF23"
Offset="0"/>
<GradientStop x:Name="BaslamaOtelemesi"
Color="#FF28AF23"
Offset="0"/>
<GradientStop x:Name="BaslamaOtelemesi1"
Color="WhiteSmoke"
Offset="0"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:KomutButonlari}}, Path=Stil}" Value="Durdurma">
<Setter Property="Data" Value="M 25 20 L 45 20 45 80 25 80 Z M 55 20 L 75 20 75 80 55 80 Z"/>
<Setter Property="Stroke" Value="#E08A10"/>
<Setter Property="StrokeLineJoin" Value="Round"/>
<Setter Property="StrokeThickness" Value="4"/>
<Setter Property="Fill">
<Setter.Value>
<LinearGradientBrush EndPoint="1,1"
StartPoint="0,1">
<GradientStop Color="#E08A10"
Offset="0"/>
<GradientStop x:Name="DurdurmaOtelemesi"
Color="#E08A10"
Offset="0"/>
<GradientStop x:Name="DurdurmaOtelemesi1"
Color="WhiteSmoke"
Offset="0"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Path.Style>
</Path>
</Border>
<ControlTemplate.Triggers>
<!-- Baslama Butonu -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Aktif" Value="True"/>
<Condition Property="Stil" Value="Baslama"/>
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<BeginStoryboard x:Name="BaslamaAnimasyonu">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="BaslamaOtelemesi"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
<DoubleAnimation Storyboard.TargetName="BaslamaOtelemesi1"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
</Storyboard>
</BeginStoryboard>
</MultiTrigger.EnterActions>
<MultiTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="BaslamaAnimasyonu"/>
</MultiTrigger.ExitActions>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Aktif" Value="True"/>
<Condition Property="Stil" Value="Durdurma"/>
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<BeginStoryboard x:Name="DurdurmaAnimasyonu">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="DurdurmaOtelemesi"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
<DoubleAnimation Storyboard.TargetName="DurdurmaOtelemesi1"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
</Storyboard>
</BeginStoryboard>
</MultiTrigger.EnterActions>
<MultiTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="DurdurmaAnimasyonu"/>
</MultiTrigger.ExitActions>
</MultiTrigger>
<!--<Trigger Property="Aktif" Value="True">
<Trigger.EnterActions>
<BeginStoryboard x:Name="AktiflikAnimasyonu">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="KaydirmaOtelemesi"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
<DoubleAnimation Storyboard.TargetName="KaydirmaOtelemesi1"
Storyboard.TargetProperty="Offset"
To="1"
Duration="0:0:0:3"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
</Trigger.ExitActions>
</Trigger>-->
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
This one is code behind;
public class KomutButonlari : ButtonBase
{
static KomutButonlari()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(KomutButonlari), new FrameworkPropertyMetadata(typeof(KomutButonlari)));
}
public enum KomutSinifi
{
Baslama,
Durdurma,
Reset,
HataSilme
}
public KomutSinifi Stil
{
get { return (KomutSinifi)GetValue(StilProperty); }
set { SetValue(StilProperty, value); }
}
// Using a DependencyProperty as the backing store for Stil. This enables animation, styling, binding, etc...
public static readonly DependencyProperty StilProperty =
DependencyProperty.Register("Stil", typeof(KomutSinifi), typeof(KomutButonlari), new PropertyMetadata(KomutSinifi.Baslama));
public bool Aktif
{
get { return (bool)GetValue(AktifProperty); }
set { SetValue(AktifProperty, value); }
}
// Using a DependencyProperty as the backing store for Aktif. This enables animation, styling, binding, etc...
public static readonly DependencyProperty AktifProperty =
DependencyProperty.Register("Aktif", typeof(bool), typeof(KomutButonlari), new PropertyMetadata(false));
}
Here is how i call my buttons;
<StackPanel Grid.Row="3" Grid.ColumnSpan="3" Orientation="Horizontal">
<nesne:KomutButonlari Aktif="{Binding Test1, Mode=TwoWay}" Width="100" Height="100" Margin="10" Stil="Baslama" Click="Button_Click"/>
<nesne:KomutButonlari Aktif="{Binding Test1, Mode=TwoWay}" Width="100" Height="100" Margin="10" Stil="Durdurma"/>
</StackPanel>
And also main window code behind;
private void Button_Click(object sender, RoutedEventArgs e)
{
Test1 = !Test1;
}
To get failure you need to click once to button to trig property change to start animation..
Any idead to implement both style in once like this ?
Update:
Solution is below,
Changing Storyboard.TargetName="BaslamaOtelemesi" to Storyboard.TargetProperty="Fill.(GradientBrush.GradientStops)[1].(GradientStop.Offset)"
work well. Also to make multi comparement with condition i just change to multidatatrigger
instead datatrigger
.
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:KomutButonlari}}, Path=Stil}" Value="Baslama">
<Setter Property="Data" Value="M 25 20 L 85 50 25 80 Z"/>
<Setter Property="Stroke" Value="#9928AF23"/>
<Setter Property="StrokeLineJoin" Value="Round"/>
<Setter Property="StrokeThickness" Value="4"/>
<Setter Property="Fill">
<Setter.Value>
<LinearGradientBrush EndPoint="1,1"
StartPoint="0,1">
<GradientStop Color="#FF28AF23"
Offset="0"/>
<GradientStop Color="#FF28AF23"
Offset="0"/>
<GradientStop Color="WhiteSmoke"
Offset="0"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:KomutButonlari}}, Path=Stil}" Value="Baslama"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:KomutButonlari}}, Path=Aktif}" Value="True"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard x:Name="BaslamaAnimasyonu">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetProperty="Fill.(GradientBrush.GradientStops)[1].(GradientStop.Offset)"
To="1"
Duration="0:0:0:3"/>
<DoubleAnimation Storyboard.TargetProperty="Fill.(GradientBrush.GradientStops)[2].(GradientStop.Offset)"
To="1"
Duration="0:0:0:3"/>
</Storyboard>
</BeginStoryboard>
</MultiDataTrigger.EnterActions>
<MultiDataTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="BaslamaAnimasyonu"/>
</MultiDataTrigger.ExitActions>
</MultiDataTrigger>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)