2016-08-12 4 views
0

Я пытаюсь создать пользовательскую StackPanel, которая выполняет анимацию (шкалу), когда изменяется свойство на модели viewmodel. Я создал Dependency Property в своем производном классеwpf custom stackpanel datatrigger

public partial class TrgScaleStackPanel : StackPanel 
{ 
    #region TriggerValue DP 

    /// <summary> 
    /// Gets or sets the Value which is being displayed 
    /// </summary> 
    public bool TriggerValue 
    { 
     get { return (bool)GetValue(TriggerValueProperty); } 
     set { SetValue(TriggerValueProperty, value); } 
    } 

    /// <summary> 
    /// Identified the Label dependency property 
    /// </summary> 
    public static readonly DependencyProperty TriggerValueProperty = 
     DependencyProperty.Register("TriggerValue", typeof(bool), 
      typeof(TrgScaleStackPanel), new PropertyMetadata(false)); 

    #endregion 
    public TrgScaleStackPanel() 
    { 
     InitializeComponent(); 
    } 
} 

В XAML я добавил стиль с DataTrigger, который связывается со свойством

<StackPanel x:Class="StackPanelDemo.TrgScaleStackPanel" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     x:Name="TrgScaleParent" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<StackPanel.Style> 
    <Style TargetType="{x:Type StackPanel}" > 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=TrgScaleParent.TriggerValue}" Value="True"> 
       <DataTrigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation Duration="0:0:0.25" To="1" Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.EnterActions> 
       <DataTrigger.ExitActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation Duration="0:0:0.25" To="0" Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.ExitActions> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</StackPanel.Style> 

зависимостей На моем тестовом окне I имеют

   <stackPanelDemo:TrgScaleStackPanel TriggerValue="{Binding SettingsViewVisible}"> 
       <TextBlock>Hello</TextBlock> 
       <Button>Goodbye</Button> 
       <stackPanelDemo:TrgScaleStackPanel.LayoutTransform> 
        <ScaleTransform ScaleX="1" ScaleY="0" /> 
       </stackPanelDemo:TrgScaleStackPanel.LayoutTransform> 
      </stackPanelDemo:TrgScaleStackPanel> 

Он строит и работает, но, к сожалению, спусковой крючок не срабатывает , Я подозреваю, что это связано с контекстом данных, но я не уверен.

Может кто-нибудь просветить меня, куда я иду неправильно

+0

Я добавил обратный вызов свойства зависимостей, и значение «значение» изменяется, но триггер не срабатывает. –

ответ

0

После долгих возился я обнаружил, что мне нужно использовать

<DataTrigger Binding="{Binding Path=TriggerValue, RelativeSource={RelativeSource Self}}" Value="True"> 

К сожалению, у меня гораздо дальше в создании действительно конфигурируемый StackPanel со шкалой анимации, как один работает в

не может заморозить этот раскадровки временной шкалы дерева для использования по теме

, когда вы пытаетесь связать свойство «To» DoubleAnimation. Это означает, что я не могу настроить направление во время разработки с использованием свойства зависимостей. Если кто-то знает, как пройти мимо, пожалуйста, дайте мне знать !!!

Еще одна интересная проблема заключалась в том, что, если я не задал LayoutTransform при использовании моего собственного StackPanel, анимация просто не срабатывает. Я не имею понятия почему?

Если кто-нибудь знает, как лучше это сделать, пожалуйста, дайте мне знать. Может быть, мой подход неправильный?