WPF Uygulama Kaynağı, İçerik ve Veri Dosyaları
Microsoft Windows uygulamaları genellikle dosya (XAML), görüntüler, video ve ses Extensible Application Markup Language yürütülebilir olmayan veriler içeren dosyalara bağımlıdır. Windows Presentation Foundation (WPF), uygulama veri dosyaları olarak adlandırılan bu tür veri dosyalarını yapılandırmak, tanımlamak ve kullanmak için özel destek sunar. Bu destek, belirli bir uygulama veri dosyası türü kümesiyle ilgilidir; bunlar:
Kaynak Dosyaları:Yürütülebilir dosya veya kitaplık WPF derlemesine derlenmiş veri dosyaları.
İçerik Dosyaları:Yürütülebilir bir WPF derlemesi ile açık bir ilişkilendirmeye sahip tek başına veri dosyaları.
Kaynak Dosyalar Sitesi:Yürütülebilir bir WPF derlemesi ile hiçbir ilişkilendirmesi olmayan tek başına veri dosyaları.
Bu üç dosya türü arasında yapılan önemli ayrımlardan biri, kaynak dosyalarının ve içerik dosyalarının derleme zamanında bilindiğidir; bir derlemenin bu derlemeler hakkında açık bilgisi vardır. Ancak kaynak dosyalarının sitesi için, bir derlemenin bunlar hakkında hiçbir bilgisi veya bir paket tekdüzi kaynak tanımlayıcısı (URI) başvurusu aracılığıyla örtülü bilgisi olabilir; İkinci durumda, başvurulan kaynak dosyasının sitenin gerçekten var olduğu garanti edilemez.
Uygulama veri dosyalarına başvuru Windows Presentation Foundation (WPF), WPF'de Paket URI'leri altında ayrıntılı olarak açıklanan Paket tekdü kaynak tanımlayıcısı (URI) Şemasını kullanır.
Bu konu başlığında, uygulama veri dosyalarını yapılandırma ve kullanma açıklanmıştır.
Kaynak Dosyalar
Bir uygulama veri dosyasının her zaman bir uygulama için kullanılabilir olması gerekirse, kullanılabilirliği garanti altına almak için bunu bir uygulamanın ana yürütülebilir derlemesine veya başvurulan derlemelerinden biri içine derlemektir. Bu tür bir uygulama veri dosyası, kaynak dosyası olarak bilinir.
Aşağıdakiler olduğunda kaynak dosyalarını kullanabilirsiniz:
Bir derlemede derledikten sonra kaynak dosyasının içeriğini güncelleştirmeniz gerek değildir.
Dosya bağımlılıklarının sayısını azaltarak uygulama dağıtımı karmaşıklığını basitleştirmek istiyorsanız.
Uygulama veri dosyanız yerelleştirilebilir olmalı (bkz. WPF Genelleştirme ve Yerelleştirmeye Genel Bakış).
Not
Bu bölümde açıklanan kaynak dosyaları, XAML Kaynakları'da açıklanan kaynak dosyalardan ve Uygulama Kaynaklarını Yönetme (.NET)bölümünde açıklanan katıştırılmış veya bağlantılı kaynaklardan farklıdır.
Kaynak Dosyalarını Yapılandırma
WPF'de kaynak dosyası, bir Microsoft derleme altyapısı (MSBuild) projesine öğe olarak dahil edilen bir Resource dosyadır.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
...
<ItemGroup>
<Resource Include="ResourceFile.xaml" />
</ItemGroup>
...
</Project>
Not
Bu Visual Studio, bir projeye dosya ekleyerek ve bunu olarak ayarerek bir kaynak dosyası Build ActionResource oluşturabilirsiniz.
Proje derlenmiş olduğunda MSBuild derlemeye derler.
Kaynak Dosyalarını Kullanma
Kaynak dosyasını yüklemek için sınıfının yöntemini çağırarak istenen kaynak dosyasını tanımlayan GetResourceStreamApplication bir paket URI'sı geçirmeniz gerekir. GetResourceStream , StreamResourceInfo kaynak dosyasını bir olarak ortaya çıkaran ve içerik Stream türünü açıklayan bir nesnesi döndürür.
Örnek olarak, aşağıdaki kod bir kaynak dosyasını yüklemek ve bir () içeriği olarak ayarlamak için GetResourceStreamPage kullanmayı FramepageFrame gösterir:
// Navigate to xaml page
Uri uri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetResourceStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;
' Navigate to xaml page
Dim uri As New Uri("/PageResourceFile.xaml", UriKind.Relative)
Dim info As StreamResourceInfo = Application.GetResourceStream(uri)
Dim reader As New System.Windows.Markup.XamlReader()
Dim page As Page = CType(reader.LoadAsync(info.Stream), Page)
Me.pageFrame.Content = page
çağrısı size erişimi sağlarken, bu özelliği ayarda kullanmak istediğiniz özelliğin türüne dönüştürme GetResourceStreamStream işleminin ek çalışmalarını gerçekleştirmeniz gerekir. Bunun yerine WPF'nin bir kaynak dosyasını doğrudan kod kullanarak bir türün özelliğine yükerek açma ve Stream dönüştürmeyle ilgilenmesine izin veebilirsiniz.
Aşağıdaki örnekte, kod kullanarak bir 'nin Page doğrudan bir içine ( ) nasıl yük FramepageFrame dengelemesi gerçekleştirin?
Uri pageUri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
this.pageFrame.Source = pageUri;
Dim pageUri As New Uri("/PageResourceFile.xaml", UriKind.Relative)
Me.pageFrame.Source = pageUri
Aşağıdaki örnek, önceki örneğin işaretleme eşdeğeridir.
<Frame Name="pageFrame" Source="PageResourceFile.xaml" />
Kaynak Dosyaları olarak Uygulama Kodu Dosyaları
Windows, sayfalar, akış belgeleri ve kaynak sözlükleri gibi paket URL'leri kullanılarak özel bir WPF uygulama kod dosyaları kümesine başvurulabilir. Örneğin, bir uygulama başlatıldığında yüklemek istediğiniz pencereye veya sayfaya başvurulan bir paket Application.StartupUri URI'sı ile özelliğini ayarlayın.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="SOOPage.xaml" />
Bunu, bir XAML dosyası bir MSBuild olarak dahil Page edilir.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
...
<ItemGroup>
<Page Include="MainWindow.xaml" />
</ItemGroup>
...
</Project>
Not
Bu Visual Studio, bir projeye Window yeni NavigationWindow , , , Page veya FlowDocumentResourceDictionary eklersiniz; işaretleme Build Action dosyası için varsayılan olarak değeri Page kullanılır.
Öğeleri olan bir proje derlenmiş olduğunda, XAML öğeleri ikili biçime Page dönüştürülür ve ilişkili derlemeye derlenmiş. Sonuç olarak, bu dosyalar tipik kaynak dosyalarıyla aynı şekilde kullanılabilir.
Not
Bir XAML dosyası bir öğe olarak yapılandırılmışsa ve bir arka kod arkası dosyası yoksa, ham XAML ham XAML'nin ikili sürümü yerine bir derlemede Resource derlenmiş olur.
İçerik Dosyaları
İçerik dosyası, yürütülebilir bir derlemeyle birlikte gevşek bir dosya olarak dağıtılır. Derlemeler bir derlemede derlenmiş olsalar da, derlemeler her içerik dosyasıyla bir ilişki kuran meta verilerle derlenmiş olur.
İçerik dosyalarını, uygulamanıza tüketen derlemeyi yeniden derlemeden güncelleştirmek istediğiniz belirli bir uygulama veri dosyası kümesi gerektirdiğinde kullanabilirsiniz.
İçerik Dosyalarını Yapılandırma
Projeye içerik dosyası eklemek için bir uygulama veri dosyasının öğe olarak dahil olması Content gerekir. Ayrıca, bir içerik dosyası doğrudan derlemeye derlenmiş değil, içerik dosyasının derlenmiş derlemeye göre bir konuma kopyalanır belirtmek için MSBuild meta veri öğesini CopyToOutputDirectory ayarlamanız gerekir. Kaynağın, bir proje her 7.000.0000 derleme çıkışı klasörüne kopyalanır. CopyToOutputDirectoryAlways Aksi takdirde, değeri kullanılarak kaynağın yalnızca en yeni sürümünün derleme çıktı klasörüne PreserveNewest kopyalanır.
Aşağıda, yalnızca kaynağın yeni bir sürümü projeye ekleniyorsa derleme çıkış klasörüne kopyalanan içerik dosyası olarak yapılandırılmış bir dosya yer a gösterir.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
...
<ItemGroup>
<Content Include="ContentFile.xaml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
...
</Project>
Not
Bu Visual Studio, bir projeye dosya ekleyerek ve bunu olarak ayarerek bir içerik dosyası oluşturun ve bunu Build ActionContent olarak Copy to Output Directory (ile aynı) ve Copy alwaysAlwaysCopy if newer (ile aynı) olarak PreserveNewest ayarlayın.
Proje derlenmiş olduğunda, AssemblyAssociatedContentFileAttribute her bir içerik dosyası için derlemenin meta verilerine bir öznitelik derlenmiş olur.
[assembly: AssemblyAssociatedContentFile("ContentFile.xaml")]
değerinin AssemblyAssociatedContentFileAttribute değeri, içerik dosyasının projenin konumundaki konumuyla ilgili yolu belirtir. Örneğin, bir içerik dosyası bir proje alt klasörüne yer alıyorsa, ek yol bilgileri değere dahil AssemblyAssociatedContentFileAttribute olur.
[assembly: AssemblyAssociatedContentFile("Resources/ContentFile.xaml")]
Değeri AssemblyAssociatedContentFileAttribute aynı zamanda derleme çıkış klasöründeki içerik dosyasının yolunun değeridir.
İçerik Dosyalarını Kullanma
İçerik dosyasını yüklemek için sınıfının yöntemini çağırarak istenen içerik dosyasını tanımlayan GetContentStreamApplication bir paket URI'sı geçirmeniz gerekir. GetContentStream , StreamResourceInfo içerik dosyasını bir olarak ortaya çıkaran ve içerik Stream türünü açıklayan bir nesnesi döndürür.
Örnek olarak, aşağıdaki kod bir içerik dosyasını yüklemek ve bunu bir ( ) içeriği olarak ayarlamak GetContentStreamPage için kullanmayı FramepageFrame gösterir.
// Navigate to xaml page
Uri uri = new Uri("/PageContentFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetContentStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;
' Navigate to xaml page
Dim uri As New Uri("/PageContentFile.xaml", UriKind.Relative)
Dim info As StreamResourceInfo = Application.GetContentStream(uri)
Dim reader As New System.Windows.Markup.XamlReader()
Dim page As Page = CType(reader.LoadAsync(info.Stream), Page)
Me.pageFrame.Content = page
çağrısı size erişimi sağlarken, bu özelliği ayarda kullanmak istediğiniz özelliğin türüne dönüştürme GetContentStreamStream işleminin ek çalışmalarını gerçekleştirmeniz gerekir. Bunun yerine WPF'nin bir kaynak dosyasını doğrudan kod kullanarak bir türün özelliğine yükerek açma ve Stream dönüştürmeyle ilgilenmesine izin veebilirsiniz.
Aşağıdaki örnekte, kod kullanarak bir 'nin Page doğrudan bir içine ( ) nasıl yük FramepageFrame dengelemesi gerçekleştirin?
Uri pageUri = new Uri("/PageContentFile.xaml", UriKind.Relative);
this.pageFrame.Source = pageUri;
Dim pageUri As New Uri("/PageContentFile.xaml", UriKind.Relative)
Me.pageFrame.Source = pageUri
Aşağıdaki örnek, önceki örneğin işaretleme eşdeğeridir.
<Frame Name="pageFrame" Source="PageContentFile.xaml" />
Kaynak Dosyaların Sitesi
Kaynak dosyaları, tarafından tanımlandığı gibi birlikte dağıtılan derlemelerle açık bir ilişkiye AssemblyAssociatedContentFileAttribute sahiptir. Ancak, bir derleme ile uygulama veri dosyası arasında aşağıdakiler de dahil olmak üzere örtülü veya mevcut olmayan bir ilişki kurmak istemeniz gereken zamanlar vardır:
Derleme zamanında bir dosya yok.
Çalışma süresine kadar derlemenizin hangi dosyaları gerektirmesi gerektirecek?
İlişkili olduğu derlemeyi yeniden derlemeden dosyaları güncelleştirebilirsiniz.
Uygulamanız ses ve video gibi büyük veri dosyaları kullanıyor ve kullanıcıların yalnızca seçmeleri kaydıyla indirmelerini istiyor.
Ve şemaları gibi geleneksel URI düzenlerini kullanarak bu tür dosyaları file:///http:// yüklemek mümkündür.
<Image Source="file:///C:/DataFile.bmp" />
<Image Source="http://www.datafilewebsite.com/DataFile.bmp" />
Ancak ve file:///http:// düzenleri, uygulamanıza tam güveni gerektirir. Uygulamanız internetten veya intranetten başlatılan bir XAML tarayıcı uygulaması (XBAP) ise ve yalnızca bu konumlardan başlatılan uygulamalar için izin verilen izinler kümesi talep ediyorsa, gevşek dosyalar yalnızca uygulamanın başlangıç sitesinden (başlatma konumu) yüklenebilir. Bu tür dosyalar kaynak dosyaların sitesi olarak bilinir.
Kaynak dosyaların sitesi kısmi güven uygulamaları için tek seçenektir, ancak kısmi güven uygulamalarıyla sınırlı değildir. Tam güven uygulamalarının, derleme zamanında hakkında bilgisi olmadığını uygulama veri dosyalarını yüklemesi gerekebilir; tam güven uygulamaları file:/// kullanabilir, ancak uygulama veri dosyaları büyük olasılıkla uygulama derlemesi ile aynı klasöre veya bir alt klasörüne yüklenir. Bu durumda, kaynak siteye başvuran siteyi kullanmak file:/// daha kolaydır, file:/// için dosyanın tam yolunun üzerinde çalışmanız gerekir.
Not
Kaynak dosyaların sitesi bir istemci makinede bir XAML tarayıcı uygulaması (XBAP) ile önbelleğe alınmazken, içerik dosyaları önbelleğe alınmaz. Sonuç olarak, bunlar yalnızca özel olarak istenen zaman indirilir. Bir XAML tarayıcı uygulaması (XBAP) uygulamasının büyük medya dosyaları varsa, bunları kaynak dosyaların sitesi olarak yapılandırmak, ilk uygulama başlatmanın çok daha hızlı olduğu ve dosyaların yalnızca isteğe bağlı olarak indirilir olduğu anlamına gelir.
Kaynak Dosyalarının Sitesini Yapılandırma
Kaynak dosyalarınız derleme zamanında mevcut değil veya bilinmiyorsa, komut satırı programını veya Microsoft Windows Yükleyicisi'nin kullanımı dahil olmak üzere gerekli dosyaların çalışma zamanında kullanılabilir olmasını sağlamak için geleneksel dağıtım XCopy mekanizmalarını kullanmalısınız.
Derleme zamanında kaynak sitede yer almak istediğiniz dosyaları biliyorsanız ama yine de açık bir bağımlılıktan kaçınmak istemiyorsanız, bu dosyaları bir MSBuild projesine öğe olarak None abilirsiniz. İçerik dosyalarında olduğu gibi, kaynak dosyanın sitenin, değer veya değer belirterek derlemeye göre bir konuma kopyalanır belirtmek için MSBuild CopyToOutputDirectoryAlways özniteliğini ayarlamanız PreserveNewest gerekir.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
...
<None Include="PageSiteOfOriginFile.xaml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
...
</Project>
Not
Bu Visual Studio, projeye bir dosya ekleyerek ve bunu olarak ayarerek bir kaynak dosyası sitesi Build ActionNone oluşturun.
Proje derlemesi MSBuild belirtilen dosyaları derleme çıkış klasörüne kopyalar.
Kaynak Dosyalarının Sitesini Kullanma
Kaynak dosyanın bir sitesini yüklemek için, istenen kaynak dosya sitesini tanımlayan bir GetRemoteStreamApplication paket URI'si geçerek sınıfının yöntemini çağırabilirsiniz. GetRemoteStream , StreamResourceInfo kaynak dosyanın sitesini bir olarak ortaya çıkaran ve içerik Stream türünü açıklayan bir nesnesi döndürür.
Örnek olarak, aşağıdaki kod kaynak dosyanın bir sitesini yüklemek ve bunu bir içeriğini () olarak ayarlamak için GetRemoteStreamPage kullanmayı FramepageFrame gösterir.
// Navigate to xaml page
Uri uri = new Uri("/SiteOfOriginFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetRemoteStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;
' Navigate to xaml page
Dim uri As New Uri("/SiteOfOriginFile.xaml", UriKind.Relative)
Dim info As StreamResourceInfo = Application.GetRemoteStream(uri)
Dim reader As New System.Windows.Markup.XamlReader()
Dim page As Page = CType(reader.LoadAsync(info.Stream), Page)
Me.pageFrame.Content = page
çağrısı size erişimi sağlarken, bu özelliği ayarda kullanmak istediğiniz özelliğin türüne dönüştürme GetRemoteStreamStream işleminin ek çalışmalarını gerçekleştirmeniz gerekir. Bunun yerine WPF'nin bir kaynak dosyasını doğrudan kod kullanarak bir türün özelliğine yükerek açma ve Stream dönüştürmeyle ilgilenmesine izin veebilirsiniz.
Aşağıdaki örnek, PageFrame kod kullanarak doğrudan bir () ' a nasıl yükleneceğini gösterir pageFrame .
Uri pageUri = new Uri("pack://siteoforigin:,,,/SiteOfOriginFile.xaml", UriKind.Absolute);
this.pageFrame.Source = pageUri;
Dim pageUri As New Uri("pack://siteoforigin:,,,/Subfolder/SiteOfOriginFile.xaml", UriKind.Absolute)
Me.pageFrame.Source = pageUri
Aşağıdaki örnek, önceki örnekteki biçimlendirme eşdeğerini örneğidir.
<Frame Name="pageFrame" Source="pack://siteoforigin:,,,/SiteOfOriginFile.xaml" />
Derleme türünü değiştirdikten sonra yeniden oluşturma
Bir uygulama veri dosyasının yapı türünü değiştirdikten sonra, değişikliklerin uygulandığından emin olmak için tüm uygulamayı yeniden oluşturmanız gerekir. Yalnızca uygulamayı oluşturuyorsanız, değişiklikler uygulanmaz.