2009-04-28 49 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

你是什麼意思,「對方似乎無法訪問它,並沒有改變任何東西」?你有錯誤信息嗎?具體的意外行爲? – 2009-04-28 12:54:56

+0

更具體地說,我有一個ListBox。在ItemContainerStyle中,我爲所有ListBoxItems定義了一個模板。在這裏,我觸發IsMouseOver和IsSelected併爲淡入/淡出效果定義一個Storyboard。當物品被徘徊時,背景應該變成橙色,當它被選中時,它會變成藍色。我可以隨意多次懸停一個項目,它可以工作。但是,如果我選擇它並再次取消選擇,則懸停效果不再起作用。如果我使用不同的屬性,它仍然有效。 – eWolf 2009-04-28 15:30:06

+0

它似乎與觸發器的順序有關。如果我將IsSelected觸發器放在IsMouseOver觸發器的前面(順便說一下,它是一個MultiTrigger,並且在IsSelected項目時不會引發),這是相反的:在項目被徘徊後IsSelected效果不起作用一旦。 – eWolf 2009-04-28 17:43:47

回答

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> 
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」路由事件)。祝你好運!