2009-11-09 42 views
0

我正在使用WPF擴展器來顯示一些模擬過程變量。WPF Expander Border Animation影響所有包含的控件?

當這些變量之一進入'警告'或'警報'狀態時,我想讓擴展器的邊界發光(或閃光)。

爲了達到這個目的,我在我的視圖模型('AnalogWarningActive'和'AnalogAlarmActive')中使用了一些綁定到一些布爾屬性的數據觸發器。數據觸發器啓動動畫擴展器邊框不透明度的故事板。

數據觸發器正如我所料:正確的邊框顏色出現,不透明度動畫開始。不過,也有2個問題:

  1. 整個擴展的不透明度(和所有包含的控件)正在發生變化,而不僅僅是它的邊界的不透明度。

  2. 當'AnalogWarningActive'和'AnalogAlarmActive'標籤返回False時,邊框消失,但透明動畫無限期地繼續(即整個擴展器繼續淡入和淡出)。

這裏是我使用的XAML:

<SolidColorBrush x:Key="AnalogAlarmBrush" Color="#FFFF8080" /> 
<SolidColorBrush x:Key="AnalogWarningBrush" Color="#FFFFFF80" /> 

<Storyboard x:Key="AlarmBorderFlasher" AutoReverse="True" RepeatBehavior="Forever"> 
    <DoubleAnimation 
     Storyboard.TargetProperty="(Border.Opacity)" 
     From="1.0" To="0.4" 
     Duration="0:0:0.8" /> 
</Storyboard> 

<Expander Header="Test Data" IsExpanded="True"> 
    <Expander.Style> 
     <Style TargetType="{x:Type Expander}"> 
      <Style.Triggers> 

       <DataTrigger Binding="{Binding Path=AnalogWarningActive}" Value="True" > 

        <DataTrigger.EnterActions> 
         <BeginStoryboard Name="WarningBorderStoryboard" Storyboard="{StaticResource AlarmBorderFlasher}" /> 
        </DataTrigger.EnterActions> 
        <DataTrigger.ExitActions> 
         <StopStoryboard BeginStoryboardName="WarningBorderStoryboard" /> 
        </DataTrigger.ExitActions> 

        <DataTrigger.Setters> 
         <Setter Property="BorderBrush" Value="{StaticResource AnalogWarningBrush}" /> 
         <Setter Property="BorderThickness" Value="4" /> 
        </DataTrigger.Setters> 

       </DataTrigger> 

       <DataTrigger Binding="{Binding Path=AnalogAlarmActive}" Value="True" > 

        <DataTrigger.EnterActions> 
         <BeginStoryboard Name="AlarmBorderStoryboard" Storyboard="{StaticResource AlarmBorderFlasher}" /> 
        </DataTrigger.EnterActions> 
        <DataTrigger.ExitActions> 
         <StopStoryboard BeginStoryboardName="AlarmBorderStoryboard" /> 
        </DataTrigger.ExitActions> 

        <DataTrigger.Setters> 
         <Setter Property="BorderBrush" Value="{StaticResource AnalogAlarmBrush}" /> 
         <Setter Property="BorderThickness" Value="4" /> 
        </DataTrigger.Setters> 

       </DataTrigger> 

      </Style.Triggers> 
     </Style> 
    </Expander.Style> 

    <!-- snipped the contents of the expander (a tabcontrol and a few text boxes, labels, etc)--> 

</Expander> 

回答

1

問題#1

不透明度在視覺諸如邊界設置會影響視覺和它的所有後代。這就是爲什麼設置Border.Opacity使一切消失。

您有兩種選擇:1.爲邊框筆劃屬性設置動畫,或2.將內容更改爲不成爲邊框的後代。

動畫描邊屬性對於編碼來說是微不足道的,但它的缺點是並非所有的畫筆都易於透明和背部動畫。例如,使用漸變畫筆很難做到這一點。另外,如果你的邊框是各種顏色的,並且你不想100%透明,那麼沒有好的方法可以在不改變顏色的情況下對筆畫進行動畫處理。

將內容更改爲不成爲Border的後代非常簡單,而且在大多數情況下我傾向於這樣做。只需更換:

<Border x:Name="MyBorder" Stroke="Red" StrokeThickness="3" CornerRadius="6"> 
    <my:ContentHere /> 
</Border> 

與此:

<Grid> 
    <Border x:Name="MyBorder" Stroke="Red" StrokeThickness="3" Stroke="Red" CornerRadius="6"> 
    <Border Stroke="Transparent" StrokeThickness="3" CornerRadius="Red"> 
    <my:ContentHere /> 
    </Border> 
</Grid> 

現在可見的邊框的不透明度可以是動畫,而透明的控制孩子的佈局和裁剪。

如果你沒有任何CornerRadius或其他有趣的業務,你可以設置內容保證金和放棄的透明邊框:

<Grid> 
    <Border x:Name="MyBorder" Stroke="Red" StrokeThickness="3" /> 
    <my:ContentHere Margin="3" /> 
</Grid> 

問題2

在第一一目瞭然我沒有看到XAML的任何問題會導致動畫在觸發值恢復爲false後繼續運行,但我沒有仔細看。從我注意到的情況來看,我認爲它會以當前值停止動畫,而不會讓它繼續運行。

您可以嘗試用RemoveStoryboard替換StopStoryboard。 RemoveStoryboard應該將動畫屬性重置爲其原始值。

+0

這完美的作品。對#1問題實施建議似乎也修復了#2。謝謝! – user158485 2009-11-09 20:07:43