2013-06-28 51 views
0

我有一個包含顏色/畫筆的數字或動態資源的窗口。作爲動態資源的SolidColorBrushes沒有更新

例如,例1 不更新「DynamicResource ColFancyMed」

<Rectangle x:Name="dbBarPeekOutRect1" Margin="3,10,10,10" > 
    <Rectangle.Fill> 
     <SolidColorBrush Color="{DynamicResource ColFancyMed}" /> 
    </Rectangle.Fill> 
</Rectangle> 

當我的應用程序啓動資源文件讀取和正確的顏色顯示。

這些顏色是主題,所以我有一些資源字典與他們的資源鍵。因此,我改變這樣的資源字典

Application.Current.Resources.MergedDictionaries.RemoveAt(0) 
Application.Current.Resources.MergedDictionaries.Insert(0, dict) 

這適用於其他地方,但不是上述。有趣的是,如果我使用以下內容。唯一的區別是我可以看到一個是Color,另一個是SolidColorBrush。

實施例2 DOES UPDATE 「DynamicResource ColFancyMed」

<Rectangle x:Name="dbBarPeekOutRect1" Margin="3,10,10,10" Fill="{DynamicResource ColFancyMed}"/> 

然後顏色變化。

那麼爲什麼示例1不工作和示例2工作?

類似的另一個地方,它不工作是在例如;

<Storyboard x:Key="dbBarPeekOutHighlight"> 
     <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="dbBarPeekOutRect1"> 
      <EasingColorKeyFrame KeyTime="0" Value="{DynamicResource ColFancyMed}"/> 
      <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FFF2F6F9"/> 
     </ColorAnimationUsingKeyFrames> 
     <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="dbBarPeekOutRect2"> 
      <EasingColorKeyFrame KeyTime="0" Value="{DynamicResource ColFancyMed}"/> 
      <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FFF2F6F9"/> 
     </ColorAnimationUsingKeyFrames> 
    </Storyboard> 

任何幫助,將不勝感激。

+0

具體你需要什麼?有些人不明白這個問題。 –

+0

如果我交換資源文件,那麼一些動態資源不會更新。有些人會。爲什麼上述不更新? – darbid

回答

0

關於與故事板的最後一個例子,如MSDN指出here

塊引用 不能使用動態資源引用和數據綁定表達式來設置故事板或動畫屬性值。這是因爲Style內的所有內容都必須是線程安全的,並且時序系統必須凍結Storyboard對象以使它們成爲線程安全的。如果Storyboard或其子時間軸包含動態資源引用或數據綁定表達式,則Storyboard不能被凍結。有關凍結和其他Freezable功能的更多信息,請參閱Freezable對象概述。

關於第一個示例,我不確定問題是您是否在實例化SolidColorBrush對象,而不是直接綁定到資源。

+0

好聽起來像是對這部分問題的答案。我將它的staticResource設置爲Windows.Resources中的資源。在Windows.Resources中,然後參考我的應用程序資源。我只是不知道如何使顏色資源引用顏色資源。 – darbid

0

對於我來說,這個例子的工作原理:

<Grid> 
    <Rectangle x:Name="dbBarPeekOutRect1" Width="100" Height="100" Margin="3,10,10,10" > 
     <Rectangle.Fill> 
      <SolidColorBrush Color="{DynamicResource MyColor}" /> 
     </Rectangle.Fill> 
    </Rectangle> 

    <Rectangle x:Name="dbBarPeekOutRect2" Width="100" Height="100" HorizontalAlignment="Left" Fill="{DynamicResource MyColor2}"/> 

    <Button Name="ChangeResource" Content="ChangeResource" Width="100" Height="30" VerticalAlignment="Bottom" Click="ChangeResource_Click" /> 
</Grid> 

處理器的ChangeResource Button

​​

我把顏色在資源App.xaml文件:

<Application.Resources> 
    <Color x:Key="MyColor">#D8C13E</Color> 
    <SolidColorBrush x:Key="MyColor2" Color="Green" /> 
</Application.Resources>   

至於動畫...如果我沒有弄錯,當使用動畫時,WPF動畫將鎖定該動畫目標屬性值,只要動畫仍處於活動狀態即可。因此DynamicResource轉化爲StaticResource。例如:當您在動畫中使用屬性Opacity時,代碼也無法訪問。

+0

看起來不錯。但爲什麼你的工作。它不能與上下文有關嗎?此外,我的應用程序啓動正常,它只是如果它動態更改。 – darbid

+0

也許是因爲'SolidColorBrush'顏色='顏色類型',而對於Rectangle.Fill屬性需要'SolidColorBrush類型'。你可以對所有的值使用ColFancyMed。 –

+0

爲了測試和寫下我圍繞這些問題。在我的問題中,我注意到一個是顏色,一個是畫筆。它甚至不會另外編譯。 – darbid