2015-03-14 4 views
0

Триггер CommandLine.Success не всегда выполняет связанный раскадровки.DataTrigger с использованием анимации Storyboard не всегда выполняется. Однако установка свойства без аннуляции выполняется

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

Я использую (VS20015 Developer Preview). Я делаю это как дефект.

Раскадровка, представляющая отказ, выполняется последовательно. Однако раскадровка, которая представляет успех, не всегда срабатывает. Когда я заменяю раскадровку успеха с помощью только средства определения свойств, тогда свойство обновляется каждый раз.

<Style x:Key="TextBoxCommandStyle" TargetType="TextBox"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Status}" Value="{x:Static consolePackage:CommandStatus.Succeeded}"> 
       <DataTrigger.EnterActions> 
        <BeginStoryboard Storyboard="{StaticResource CommandSucessfulStory}"/> 
       </DataTrigger.EnterActions> 
      </DataTrigger> 

      <DataTrigger Binding="{Binding Status}" Value="{x:Static consolePackage:CommandStatus.Failed}"> 
       <DataTrigger.EnterActions> 
        <BeginStoryboard Storyboard="{StaticResource CommandFailedStory}"/> 
       </DataTrigger.EnterActions> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

Теперь, если я заменю раскадровку успеха быть вызвано только с имущественным сеттера, то DataTrigger будут выполнены каждый раз.

<Style.Triggers> 
      <Setter Property="Foreground" Value="LightGreen" /> 
     </DataTrigger> 

     <DataTrigger Binding="{Binding Status}" Value="{x:Static consolePackage:CommandStatus.Failed}"> 
      <Setter Property="Foreground" Value="Red" /> 
     </DataTrigger> 
    </Style.Triggers> 

код Источник: Holoware

+0

Сценарий 'CommandSucessfulStory', изменяющий то же свойство, что' CommandFailedStory'? – dbvega

+0

Да. Они работают по тому же имуществу –

+0

Проверьте мой ответ, я надеюсь, что это поможет вам. Оценка/голосование действительно оценивается. – dbvega

ответ

1

Я очень уверен, что проблема в том, что вы должны использовать StopStoryboard перед тем BeginStoryboard.

Таким образом, стиль ресурс должен выглядеть примерно так:

<Style x:Key="TextBoxCommandStyle" TargetType="TextBox"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Status}" Value="{x:Static consolePackage:CommandStatus.Succeeded}"> 
      <DataTrigger.EnterActions> 
       <StopStoryboard BeginStoryboardName="bSbFailed"/> 
       <BeginStoryboard x:Name="bSbSucessful" Storyboard="{StaticResource CommandSucessfulStory}"/> 
      </DataTrigger.EnterActions> 
     </DataTrigger> 

     <DataTrigger Binding="{Binding Status}" Value="{x:Static consolePackage:CommandStatus.Failed}"> 
      <DataTrigger.EnterActions> 
       <StopStoryboard BeginStoryboardName="bSbSucessful"/> 
       <BeginStoryboard x:Name="bSbFailed" Storyboard="{StaticResource CommandFailedStory}"/> 
      </DataTrigger.EnterActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

код Частичное XAML (с тем же именем объекты):

<Grid> 
    <Grid.DataContext> 
     <consolePackage:StatusClass x:Name="GridDataContext"/> 
    </Grid.DataContext> 
    <Grid.Resources> 
     <Storyboard x:Key="CommandSucessfulStory"> 
      <Storyboard Storyboard.TargetProperty="(TextBox.Foreground).(SolidColorBrush.Color)" > 
       <ColorAnimation To="Green" Duration="00:00:0.025"/> 
      </Storyboard> 
     </Storyboard> 

     <Storyboard x:Key="CommandFailedStory"> 
      <Storyboard Storyboard.TargetProperty="(TextBox.Foreground).(SolidColorBrush.Color)" > 
       <ColorAnimation To="Red" Duration="00:00:0.025"/> 
      </Storyboard> 
     </Storyboard> 

     <Style x:Key="TextBoxCommandStyle" TargetType="TextBox"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Status}" Value="{x:Static consolePackage:CommandStatus.Succeeded}"> 
        <DataTrigger.EnterActions> 
         <StopStoryboard BeginStoryboardName="bSbFailed"/> 
         <BeginStoryboard x:Name="bSbSucessful" Storyboard="{StaticResource CommandSucessfulStory}"/> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 

       <DataTrigger Binding="{Binding Status}" Value="{x:Static consolePackage:CommandStatus.Failed}"> 
        <DataTrigger.EnterActions> 
         <StopStoryboard BeginStoryboardName="bSbSucessful"/> 
         <BeginStoryboard x:Name="bSbFailed" Storyboard="{StaticResource CommandFailedStory}"/> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Grid.Resources> 

    <TextBox Text="---TARGET TEXT---" Style="{StaticResource TextBoxCommandStyle}"/> 
</Grid> 

Вложенные классы:

public class StatusClass : INotifyPropertyChanged 
{ 
    private string _status; 
    public string Status 
    { 
     get { return _status; } 
     set 
     { 
      if (string.Equals(_status, value)) 
       return; 

      _status = value; 
      OnPropertyChanged("Status"); 
     } 
    } 

    public StatusClass() 
    { 
     _status = CommandStatus.Failed; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class CommandStatus 
{ 
    public static readonly string Succeeded = "SucceededValue"; 
    public static readonly string Failed = "FailedValue"; 
} 

Надеюсь, это поможет.

+0

Благодарим вас за предложение. Я испытаю это позже сегодня. –

+0

@ScottNimrod дайте мне знать результаты. – dbvega

+0

Нет. Это не сработало для меня. При попытке вашего предложения я получаю ошибку выполнения во время моего изменения свойства. –

 Смежные вопросы

  • Нет связанных вопросов^_^