2012-09-24 18 views
2

我有幾個動畫作爲窗口資源中的故事板。是否可以將<Window.Resources>移動到單獨的文件中?

有沒有辦法將它們移動到單獨的文件並仍然可以訪問它們? 如果是,請告訴我如何。

只是要清楚,我想下面生成的代碼從我MainWindow.xaml文件移動到一個單獨的文件,所以我可以保持代碼的整潔和組織:

<Window.Resources> 
     <Storyboard x:Key="sbShowWindow"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="layoutRoot"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="0.874"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseInOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseInOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="layoutRoot"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="0.874"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseInOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseInOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="layoutRoot"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="0"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseInOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseInOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="layoutRoot"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="0"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseInOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseInOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="layoutRoot"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="0"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseIn"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.595"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseIn"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseIn"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
     <Storyboard x:Key="sbHideWindow"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="layoutRoot"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="1"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.874"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="layoutRoot"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="1"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.874"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="layoutRoot"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="0"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="layoutRoot"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="0"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="layoutRoot"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="1"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CubicEase EasingMode="EaseIn"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.245"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CubicEase EasingMode="EaseIn"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CubicEase EasingMode="EaseIn"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
    </Window.Resources> 

回答

7

您可以將此代碼放入單獨的資源字典中,無論是在相同的程序集中,還是在另一個程序集中。然後,所有你需要的是添加字典到窗口的資源合併字典集合:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Folder/YourResourceDictionary.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 

這裏的包URI的syntax

+0

問題是我以前從未做過這件事。我不知道如何正確地將我的問題的代碼移到資源字典中。我創建了一個新的資源字典文件並粘貼了代碼,但是我得到了一些'Ambiguous reference'錯誤... – IneedHelp

+0

更新:好吧,我似乎通過刪除'標籤。 – IneedHelp

+0

好吧,我終於明白了,非常感謝。 – IneedHelp

0

一個解決辦法是將它們放入App.xaml中作爲資源。這樣你就可以擁有全球可訪問的資源。

另一種方法(我更喜歡)是將資源相關的東西定義在單獨的資源字典中,並將其加載到Application_StartUp事件的代碼中。當選擇加載哪些資源文件時,它給了我更多的靈活性。

一些示例代碼:

 var basicUriString = String.Format("/{0}.Base;component/Basic.xaml", skinName); 

     try 
     { 
      var uri = new Uri(basicUriString, UriKind.RelativeOrAbsolute); 
      newDict = new ResourceDictionary { Source = uri }; 
      if (!Application.Current.Resources.MergedDictionaries.Any(dic => dic.Source.OriginalString.Contains(basicUriString))) 
      { 
       Application.Current.Resources.MergedDictionaries.Add(newDict); 
      } 
     } 
     catch (Exception e) 
     { 
      // log error 
     } 

此方法添加資源字典到應用程序資源假定存在名爲{skinName} .Base組裝件我通過在作爲方法參數中。

+0

好的,將這些動畫添加到資源字典並在應用程序啓動時加載它們聽起來不錯。你能提供一些步驟讓我遵循嗎?就像,我需要做些什麼才能做到這一點?剪下代碼,創建一個新文件,粘貼在那裏,或? – IneedHelp

+0

我創建了一個新的資源字典(這是一個帶有ResourceDictionary標記的xaml文件),並在其中粘貼了代碼,但我遇到了一些錯誤。我仍在調查。 – IneedHelp

相關問題