2016-12-14 157 views
3

我正在尋找一種方法來共享項目之間的ResourceDictionary與資源字典共享項目(xaml)

將新項目添加到共享項目不提供資源字典。它可以在其他(主)項目中創建並拖動。與

enter image description here

的想法是加載資源字典這樣

var dictionary = new ResourceDictionary(); 
dictionary.Source = new Uri("/WpfApplication91;component/Dictionary2.xaml", UriKind.Relative); 

這顯然是失敗目前:但我不能改變它的生成選項

PresentationFramework.dll中發生類型爲「System.IO.IOException」的異常,但未處理d用戶代碼

附加信息:找不到資源'dictionary2.xaml'。

任何想法?

回答

2

這是可能的手動編輯共享的項目設置資源字典生成操作。

共享工程由Project.shprojProject.projitems文件,打開第二和定位的字典裏:

<ItemGroup> 
    <None Include="$(MSBuildThisFileDirectory)Dictionary.xaml" /> 
</ItemGroup> 

添加後

<ItemGroup> 
    <Page Include="$(MSBuildThisFileDirectory)Dictionary.xaml"> 
    <Generator>MSBuild:Compile</Generator> 
    <SubType>Designer</SubType> 
    </Page> 
</ItemGroup> 

它含有正常csproj複製/粘貼的事情WPF項目字典。

似乎可以工作,但是當項目加載到Visual Studio中時,此構建操作不可見。將文件添加到共享項目不會影響此手動更改。

現在我可以共享包含資源字典的項目了,耶!

資源字典可以被合併到應用字典等,如果它位於該項目的根(在XAML設計使用如靜態/動態資源):

<Application.Resources> 
    <ResourceDictionary > 
     <ResourceDictionary.MergedDictionaries> 
      <!-- doesn't really exists in project --> 
      <ResourceDictionary Source="Dictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

和/或手動加載,例如使用此pack Uri

var dictionary = new ResourceDictionary() 
{ 
    Source = new Uri("pack://application:,,,/FlexProperty.xaml"), 
}; 
0

此問題是您正在放置應用程序名稱。你需要項目名稱。下面是如何做到這一點在這兩個XAML和代碼

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/SharedProject1;Component/Dictionary2.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

或者

var dictionary = new ResourceDictionary(); 
dictionary.Source = new Uri("/SharedProject1;component/Dictionary2.xaml", UriKind.Relative); 
+0

不,應用程序的名稱應該只是罰款。用Dictionary1.xaml代替'Dictionary2.xaml'將使我的代碼正常工作,但我的目標是在共享項目中定位字典。你的改變應該有所作爲,因爲構建動作仍然是「無」。您可以創建相同的項目結構(wpf解決方案,添加共享項目,添加資源字典,將其移動到共享項目),並將代碼放入主窗口構造函數中並親自查看。 – Sinatr

+0

你試過我的迴應嗎?因爲您的無共享項目也是應用程序的名稱。 – Bryan

+0

*「您的無共享項目也是應用程序的名稱」* - 我不明白這一點。沒有必要嘗試任何東西,只要構建動作仍然是「無」,它就無法工作。 – Sinatr

2

我遇到了同樣的問題。有一個將Xaml包含在共享項目中的解決方案,它不需要直接編輯.projitems文件。

您只需將Xamarin添加到您的Visual Studio安裝中即可。

您現在可以通過平時的Visual Studio對話框中添加XAML類型(我用VS 2015年社區做到了): Add Resource Dictionary

和正確的構建行爲是有效的: Build action

XAML中共享項目現在編譯並按預期運行。

(想必這是有支持Xamarin Forms,但它可以用於任何XAML文檔。)

+0

我添加了一些截圖。 –

+0

您在UWP解決方案中使用共享項目。它不能解決我的WPF解決方案問題。 – Sinatr

+0

您可以將共享項目添加到任何通常能夠進行的項目,包括WPF項目。 –