2009-04-28 5 views
7

У меня есть несколько раскадровки, которые получают доступ к одному и тому же свойству (не в одно и то же время). После того, как одна раскадровка изменила собственность, другая, похоже, не имеет к ней доступа и ничего не меняет. Что я могу сделать против этого?Несколько раскадровки на одном объекте

Пример:

<ListBox> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <Border Name="Border" BorderBrush="DarkGray" BorderThickness="1" Margin="3"> 
          <ContentPresenter /> 
          <Border.Background> 
           <SolidColorBrush /> 
          </Border.Background> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="True"> 
           <Trigger.EnterActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="#3e8bff" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </Trigger.EnterActions> 
           <Trigger.ExitActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </Trigger.ExitActions> 
          </Trigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsMouseOver" Value="True" /> 
            <Condition Property="IsSelected" Value="False" /> 
           </MultiTrigger.Conditions> 
           <MultiTrigger.EnterActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Orange" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </MultiTrigger.EnterActions> 
           <MultiTrigger.ExitActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </MultiTrigger.ExitActions> 
          </MultiTrigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.Items> 
     <sys:String>hey</sys:String> 
     <sys:String>du</sys:String> 
     <sys:String>dux</sys:String> 
     <sys:String>duy</sys:String> 
     <sys:String>dua</sys:String> 
    </ListBox.Items> 
</ListBox> 

Это самый маленький пример кода, я мог бы сделать. После того, как вы наведете элемент, он не станет синим, когда он будет выбран (попробуйте щелкнуть по одному элементу, а затем с помощью клавиш со стрелками выбрать элементы, не зависая их).

+0

Что именно вы подразумеваете под «другим, похоже, нет доступа к нему и ничего не меняет»? Вы получили сообщение об ошибке? Конкретное неожиданное поведение? –

+0

Чтобы быть более конкретным, у меня есть ListBox. В ItemContainerStyle я определяю шаблон для всех ListBoxItems. Здесь я запускаю IsMouseOver и IsSelected и определяю Storyboard для эффекта постепенного выцветания. Когда элемент парит, фон должен быть оранжевым, а когда он выбран, он должен стать синим. Я могу навешивать один элемент столько раз, сколько хочу, он работает. Но если я его выберу и снова отменим выбор, эффект зависания больше не работает. Если я использую разные свойства, он все равно работает. – eWolf

+0

Кажется, что-то с порядком триггеров. Если я поставлю триггер IsSelected перед триггером IsMouseOver (который, кстати, является MultiTrigger и не поднимается, когда элемент IsSelected), это наоборот: эффект IsSelected не работает после того, как элемент был завис один раз. – eWolf

ответ

12

У меня есть решение !!! Триггеры и порядок действий имеют значение ... ответ заключается не в том, чтобы одновременно играть более одного раскадровки, а просто останавливать других.

<ControlTemplate.Triggers> 
    <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsMouseOver" Value="True"/> 
       <Condition Property="Selector.IsSelected" Value="False" /> 
      </MultiTrigger.Conditions> 
      <MultiTrigger.EnterActions> 
       <StopStoryboard BeginStoryboardName="SelectedBegin" /> 
       <StopStoryboard BeginStoryboardName="UnselectBegin" /> 
       <BeginStoryboard x:Name="EnterBegin" Storyboard="{StaticResource MouseEnterSb}"/> 
      </MultiTrigger.EnterActions> 
      <MultiTrigger.ExitActions> 
       <BeginStoryboard x:Name="LeaveBegin" Storyboard="{StaticResource MouseLeaveSb}"/> 
      </MultiTrigger.ExitActions> 
     </MultiTrigger> 
     <Trigger Property="Selector.IsSelected" Value="True"> 
    <Trigger.EnterActions> 
       <StopStoryboard BeginStoryboardName="LeaveBegin" /> 
       <StopStoryboard BeginStoryboardName="EnterBegin" /> 
       <BeginStoryboard x:Name="SelectedBegin" Storyboard="{StaticResource SelectedSb}"/> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
       <BeginStoryboard x:Name="UnselectBegin" Storyboard="{StaticResource UnselectSb}"/> 
    </Trigger.ExitActions> 
    </Trigger> 
</ControlTemplate.Triggers> 
+0

Ничего себе. Довольно долгое время с тех пор, как я разместил этот вопрос ..;) Круто, что вы могли бы понять это наконец! – eWolf

1

Я был в состоянии воспроизвести ваши ошибочные результаты, используя следующий код (я озадачен тоже):

<ListBox> 
<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <ControlTemplate.Resources> 
         <Storyboard x:Key="BorderAnimationToRed"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.1" /> 
         </Storyboard> 
         <Storyboard x:Key="BorderAnimationToBlue"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Blue" Duration="0:0:0.1" /> 
         </Storyboard> 
         <Storyboard x:Key="BorderAnimationToOrange"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Orange" Duration="0:0:0.1" /> 
         </Storyboard> 
         <Storyboard x:Key="BorderAnimationToWhite"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" /> 
         </Storyboard> 
        </ControlTemplate.Resources> 
        <Border Name="Border" BorderBrush="DarkGray" BorderThickness="1" Margin="3"> 
         <ContentPresenter /> 
         <Border.Background> 
          <SolidColorBrush /> 
         </Border.Background> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Trigger.EnterActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToOrange}"/> 
          </Trigger.EnterActions> 
          <Trigger.ExitActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToWhite}"/> 
          </Trigger.ExitActions> 
         </Trigger> 
         <Trigger Property="IsSelected" Value="True"> 
          <Trigger.EnterActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToBlue}"/> 
          </Trigger.EnterActions> 
          <Trigger.ExitActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToWhite}"/> 
          </Trigger.ExitActions> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ListBox.ItemContainerStyle> 
<ListBox.Items> 
    <sys:String>hey</sys:String> 
    <sys:String>du</sys:String> 
    <sys:String>dux</sys:String> 
    <sys:String>duy</sys:String> 
    <sys:String>dua</sys:String> 
</ListBox.Items> 

Этот код немного легче читать, как визуальные эффекты, ресурсы и триггеры объявляются отдельно. Возможно, вы можете попытаться использовать EventTriggers для достижения своей цели (используя маршрутизированные события «ListBoxItem.MouseEnter» и «ListBoxItem.MouseLeave»). Удачи!

+0

Я знаю, что только что создал элементы управления, которые я хочу изменить дважды (это было возможно в моем случае, я просто разместил упрощенный пример). Быстрый + грязный .. – eWolf

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