2015-10-06 2 views
2

У меня есть проект холста WPF, где я перетаскиваю объекты на холсте из панели инструментов. На основании определенных данных некоторые из этих объектов должны мигать или мигать. Я получаю необработанное исключение: Невозможно оживить '(Foreground). (0)' на экземпляре неизменяемого объекта. Ниже приведен мой код. Кто-то предложил использовать (Foreground) (SolidColorBrush.Color), и я изменил его в своей разметке, но, похоже, не исправил его. Свойство Foreground не указывает на DependencyObject в пути '(Foreground). (0)'

<!-- DataTemplate for DesignerCanvas look and feel --> 
<DataTemplate DataType="{x:Type viewModels:SingleValueControlViewModel}"> 
    <Grid> 

     <Label Name="label" Content="{Binding TagValue}" IsHitTestVisible="False" Height="{Binding ItemHeight}" Width="{Binding ItemWidth}" 
      Background="{Binding BackColor}"  
      Foreground="{Binding ForeColor}" 
      BorderBrush="{Binding BorderColor}" 
      BorderThickness="{Binding StyleProperties.BorderWidth}" 
      FontFamily="{Binding StyleProperties.Font.FontFamily}" 
      FontSize = "{Binding StyleProperties.Font.Size}" 
      FontStyle="{Binding StyleProperties.Font.Style}" 
      HorizontalContentAlignment="{Binding TextAlign}" > 
<Label.Style> 
       <Style> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding StyleProperties.FlashEnable}" Value="true"> 
          <Setter Property="Label.Background" Value="Black"></Setter> 
          <Setter Property="Label.Foreground" Value="Red"></Setter> 
          <DataTrigger.EnterActions> 
           <BeginStoryboard> 
            <Storyboard RepeatBehavior="Forever"> 
             <ColorAnimation 
              Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)" 
              Duration="00:00:00:01" 
              From="Black" To="Red"> 
             </ColorAnimation> 
            </Storyboard> 
           </BeginStoryboard> 
          </DataTrigger.EnterActions> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Label.Style> 

    </Grid> 
</DataTemplate> 

+0

вспышкой? что вы подразумеваете под словом «некоторые из этих объектов должны мигать». эти объекты будут содержать флеш-ролик? или они будут выглядеть по-другому, как светящиеся и т. д. – AnjumSKhan

+0

Отправьте соответствующий код, пожалуйста. – Dennis

+0

@ user3798700 Я получил вашу мысль, опубликую ответ, я работаю над этим. – AnjumSKhan

ответ

1

/* Окончательный ответ после проверки кода пользователя */

Добавьте это в DiagramControl.xaml

<DataTrigger Binding="{Binding IsSelected}" Value="True">               
    <Setter Property="Opacity" Value="1"/> 
    <DataTrigger.EnterActions> 
     <BeginStoryboard> 
      <Storyboard RepeatBehavior="Forever"> 
       <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To=" 0.1" Duration="00:00:0.3"/> 
      </Storyboard> 
     </BeginStoryboard> 
    </DataTrigger.EnterActions>             
</DataTrigger> 

/* Свежее обновление, как пользователь все еще может» t запустить свою анимацию и сообщить об ошибке, указанную в комментарии */

Вы должны обладать свойствами фона, переднего плана и помнить, что объекты Brush неизменяемы. Существует обходной путь, как описано в следующей MSDN ссылке:

immutable instance animation error

debugging animations

/* Новый ответ отправил после того, как пользователь обновил свой вопрос с настоящим XAML кода */

Я использовал код как это показано ниже с одним добавлением TargetType = "Label", и он работает отлично. Я использовал свою собственную привязку StyleProperties.FlashEnable для работы вашего DataTrigger.

Это одна сторона. Другая сторона: вы делаете все это динамически, когда перетаскиваете элементы в холст. Для этого вам нужно применить свой стиль/триггеры в коде.

<Grid> 
<Label Content="Hi ! I am added dynamically" TextBlock.FontSize="45"> 
    <Label.Style> 
    <Style TargetType="Label"> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding StyleProperties.FlashEnable, Mode=OneWay}" Value="true"> 
     <Setter Property="Label.Background" Value="Black"></Setter> 
     <Setter Property="Label.Foreground" Value="Red"></Setter> 
     <DataTrigger.EnterActions> 
      <BeginStoryboard> 
       <Storyboard RepeatBehavior="Forever"> 
       <ColorAnimation 
        Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)" 
        Duration="00:00:00:01" 
        From="Black" To="Red"> 
        </ColorAnimation> 
       </Storyboard> 
      </BeginStoryboard> 
      </DataTrigger.EnterActions> 
     </DataTrigger>       
     </Style.Triggers> 
    </Style> 
    </Label.Style> 
</Label> 
</Grid> 

/* Старый ответ опубликовано ранее пользователь обновил свой вопрос */ Чтобы показать объект мигает, вы должны изменить их передний план собственности. И этот цвет переднего плана должен исходить от некоторой переменной. Для привязки вам нужно использовать свойство зависимости, или ваш класс, содержащий ваше свойство/переменную, должен реализовать INotifyPropertyChanged, чтобы ваше свойство увеличивало событие PropertyChanged.

Вы также должны указать начальное значение переднего плана, если вы используете анимацию.

Возможно, вы используете DynamicResource вместо StaticResource.

Подробнее можно сказать, если вы разместите XAML.

+0

По-прежнему получить ту же ошибку - не может анимировать '(Foreground). (0)' на экземпляре неизменяемого объекта. Я привязываю цвета фона и переднего плана перед стилем. Как вы думаете, это то, что заставляет его не работать? – user3798700

+0

@ user3798700 нажмите здесь: http://chat.stackoverflow.com/rooms/18165/wpf – AnjumSKhan

+0

@ user3798700 r u там? – AnjumSKhan

0

Это работает для меня:

<Style TargetType="Label"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding FlashEnable}" Value="True"> 
      <Setter Property="Background" Value="Black"/> 
      <Setter Property="Foreground" Value="Red"/> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard RepeatBehavior="Forever"> 
         <ColorAnimation 
          Storyboard.TargetProperty="Foreground.Color" 
          Duration="0:0:1" From="Black" To="Red"> 
         </ColorAnimation> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Вы также можете явно установить SolidColorBrush в стиле сеттер переднего плана объекта недвижимости:

<Style TargetType="Label"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding FlashEnable}" Value="True"> 
      <Setter Property="Background" Value="Black"/> 
       <Setter Property="Foreground"> 
        <Setter.Value> 
         <SolidColorBrush Color="Red"/> 
        </Setter.Value> 
       </Setter> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard RepeatBehavior="Forever"> 
         <ColorAnimation 
          Storyboard.TargetProperty="Foreground.Color" 
          Duration="0:0:1" From="Black" To="Red"> 
         </ColorAnimation> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

Я пробовал приведенный выше код, но получаю ошибку - не может анимировать '(Foreground). (0)' на экземпляре неизменяемого объекта. Я также обновил xaml, чтобы storyboard.targetproperty = "(Foreground). (SolidColorBrush.Color)", но я все равно получаю ту же ошибку. – user3798700

+0

См. Мое редактирование. – Clemens

+0

Это внутри моей таблицы данных. Когда я вставляю свой код, он говорит, что свойство Content установлено более одного раза. Я собираюсь изменить исходное сообщение, чтобы включить полный xaml. Прошу прощения за то, что вы не внесли полный код. Спасибо за вашу помощь. – user3798700

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