WPF Uygulama Kaynağı, İçerik ve Veri Dosyaları
Microsoft Windows uygulamaları genellikle Genişletilebilir Uygulama İşaretlemesi Dili (XAML), görüntüler, video ve ses gibi yürütülebilir olmayan veriler içeren dosyalara bağlı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, aşağıdakiler de dahil olmak üzere belirli bir uygulama veri dosyası türleri kümesi etrafında döner:
Kaynak Dosyaları: Yürütülebilir dosya veya kitaplık WPF derlemesinde derlenen veri dosyaları.
İçerik Dosyaları: Yürütülebilir WPF derlemesiyle açık bir ilişkilendirmesi olan tek başına veri dosyaları.
Kaynak Dosyaların Sitesi: Yürütülebilir WPF derlemesiyle ilişkisi olmayan tek başına veri dosyaları.
Bu üç dosya türü arasında yapılması gereken önemli farklardan biri, kaynak dosyalarının ve içerik dosyalarının derleme zamanında bilinmesidir; bir derlemenin bunlar hakkında açık bilgisi vardır. Ancak kaynak dosya sitesi için bir derlemenin bu dosyalar hakkında hiçbir bilgisi olmayabilir veya paket tekdüzen kaynak tanımlayıcısı (URI) başvurusu aracılığıyla örtük bilgi sahibi olmayabilir; ikinci durumda, başvuruda bulunılan kaynak dosyanın gerçekten var olduğunu garanti yoktur.
Uygulama veri dosyalarına başvurmak için, Windows Presentation Foundation (WPF), WPF'deki Paket URI'leri bölümünde ayrıntılı olarak açıklanan Paket tekdüzen kaynak tanımlayıcısı (URI) Şemasını kullanır.
Bu konu başlığında, uygulama veri dosyalarının nasıl yapılandırıldığı ve kullanılacağı açıklanmaktadır.
Kaynak Dosyalar
Bir uygulama veri dosyasının her zaman bir uygulama için kullanılabilir olması gerekiyorsa, kullanılabilirliği garanti etmenin tek yolu bunu uygulamanın ana yürütülebilir derlemesinde veya başvuruda bulunan derlemelerinden birinde derlemektir. Bu tür bir uygulama veri dosyası, kaynak dosyası olarak bilinir.
Kaynak dosyalarını şu durumlarda kullanmalısınız:
Bir derlemede derlenen kaynak dosyasının içeriğini güncelleştirmeniz gerekmez.
Dosya bağımlılıklarının sayısını azaltarak uygulama dağıtımı karmaşıklığını basitleştirmek istiyorsunuz.
Uygulama veri dosyanızın yerelleştirilebilir olması gerekir (bkz. WPF Genelleştirme ve Yerelleştirmeye Genel Bakış).
Dekont
Bu bölümde açıklanan kaynak dosyaları, XAML Kaynakları'nda açıklanan kaynak dosyalarından farklıdır ve Uygulama Kaynaklarını Yönetme (.NET) bölümünde açıklanan ekli veya bağlı kaynaklardan farklıdır.
Kaynak Dosyalarını Yapılandırma
WPF'de kaynak dosyası, 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>
Dekont
Visual Studio'da bir projeye dosya ekleyip olarak ayarlayarak Build Action
Resource
bir kaynak dosyası oluşturursunuz.
Proje oluşturulduğunda MSBuild, kaynağı derlemeye derler.
Kaynak Dosyalarını Kullanma
Kaynak dosyasını yüklemek için sınıfının yöntemini Application çağırabilir GetResourceStream ve istenen kaynak dosyasını tanımlayan bir paket URI'sini geçirebilirsiniz. GetResourceStream , kaynak dosyasını bir StreamResourceInfo olarak kullanıma sunan ve içerik türünü açıklayan bir Stream nesnesi döndürür.
Örnek olarak, aşağıdaki kod bir Page kaynak dosyasını yüklemek ve bunun içeriğini Frame (pageFrame
olarak ayarlamak için nasıl kullanılacağını GetResourceStream 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ı GetResourceStream özelliğine Streamerişmenizi sağlarken, bunu ayarladığınız özelliğin türüne dönüştürmek için ek çalışma yapmanız gerekir. Bunun yerine, kod kullanarak bir kaynak dosyasını doğrudan türün özelliğine yükleyerek Stream WPF'nin dosyasını açmasını ve dönüştürmesini sağlayabilirsiniz.
Aşağıdaki örnekte, kodu kullanarak doğrudan (pageFrame
) içine Frame nasıl yüklenecek Page gösterilmektedir.
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 URI'leri kullanılarak özel bir WPF uygulama kodu dosyaları kümesine başvurulabilir. Örneğin, bir uygulama başlatıldığında yüklemek istediğiniz pencereye veya sayfaya başvuran bir paket URI'siyle özelliğini ayarlayabilirsiniz Application.StartupUri .
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="SOOPage.xaml" />
Bir XAML dosyası bir MSBuild projesine öğe olarak Page
eklendiğinde bunu yapabilirsiniz.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
...
<ItemGroup>
<Page Include="MainWindow.xaml" />
</ItemGroup>
...
</Project>
Dekont
Visual Studio'da, bir projeye yeni Windowbir , PageNavigationWindow, , FlowDocumentveya ResourceDictionary eklersiniz; Build Action
işaretleme dosyası için varsayılan olarak olurPage
.
Öğeleri olan Page
bir proje derlendiğinde, XAML öğeleri ikili biçime dönüştürülür ve ilişkili derlemeye derlenir. Sonuç olarak, bu dosyalar tipik kaynak dosyalarıyla aynı şekilde kullanılabilir.
Dekont
Bir XAML dosyası bir Resource
öğe olarak yapılandırılmışsa ve arka planda kod içeren bir dosyası yoksa, ham XAML, ham XAML'nin ikili sürümü yerine bir derlemede derlenmiş olur.
İçerik Dosyaları
İçerik dosyası yürütülebilir derlemenin yanı sıra gevşek bir dosya olarak dağıtılır. Derlemede derlenmese de, derlemeler her içerik dosyasıyla bir ilişkilendirme oluşturan meta verilerle derlenir.
Uygulamanız, bunları kullanan derlemeyi yeniden derlemeden güncelleştirmek istediğiniz belirli bir uygulama veri dosyası kümesi gerektirdiğinde içerik dosyalarını kullanmanız gerekir.
İçerik Dosyalarını Yapılandırma
Projeye içerik dosyası eklemek için bir uygulama veri dosyasının öğe olarak Content
eklenmesi gerekir. Ayrıca, bir içerik dosyası doğrudan derlemeye derlenmediğinden, içerik dosyasının derlenmiş derlemeye göre bir konuma kopyalandığını belirtmek için MSBuild CopyToOutputDirectory
meta veri öğesini ayarlamanız gerekir. Her proje oluşturulduğunda kaynağın derleme çıktı klasörüne kopyalanmasını istiyorsanız meta veri öğesini değeriyle Always
ayarlarsınızCopyToOutputDirectory
. Aksi takdirde, değeri kullanarak kaynağın yalnızca en yeni sürümünün derleme çıktı klasörüne kopyalandığından PreserveNewest
emin olabilirsiniz.
Aşağıda, yalnızca kaynağın yeni bir sürümü projeye eklendiğinde derleme çıktı klasörüne kopyalanan bir içerik dosyası olarak yapılandırılmış bir dosya gösterilmektedir.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
...
<ItemGroup>
<Content Include="ContentFile.xaml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
...
</Project>
Dekont
Visual Studio'da, bir projeye dosya ekleyerek ve olarak ayarlayarak Build Action
Content
bir içerik dosyası oluşturursunuz ve bunu Copy always
Copy to Output Directory
(ile Always
aynı) ve Copy if newer
(ile PreserveNewest
aynı) olarak ayarlarsınız.
Proje oluşturulduğunda, her içerik dosyası için derlemenin meta verilerine bir AssemblyAssociatedContentFileAttribute öznitelik derlenir.
[assembly: AssemblyAssociatedContentFile("ContentFile.xaml")]
değeri AssemblyAssociatedContentFileAttribute , içerik dosyasının projedeki konumuna göre yolunu gösterir. Örneğin, bir içerik dosyası proje alt klasöründe bulunuyorsa, ek yol bilgileri değere AssemblyAssociatedContentFileAttribute dahil edilir.
[assembly: AssemblyAssociatedContentFile("Resources/ContentFile.xaml")]
AssemblyAssociatedContentFileAttribute Bu değer, derleme çıktı klasöründeki içerik dosyasının yolunun da değeridir.
İçerik Dosyalarını Kullanma
İçerik dosyasını yüklemek için sınıfının yöntemini Application çağırabilir GetContentStream ve istenen içerik dosyasını tanımlayan bir paket URI'sini geçirebilirsiniz. GetContentStream , içerik dosyasını bir StreamResourceInfo olarak kullanıma sunan ve içerik türünü açıklayan bir Stream nesnesi döndürür.
Örneğin, aşağıdaki kodda bir Page içerik dosyasını yüklemek ve bunun içeriğini (pageFrame
olarak ayarlamak için nasıl kullanılacağı GetContentStream gösterilmektedir Frame .
// 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ı GetContentStream özelliğine Streamerişmenizi sağlarken, bunu ayarladığınız özelliğin türüne dönüştürmek için ek çalışma yapmanız gerekir. Bunun yerine, kod kullanarak bir kaynak dosyasını doğrudan türün özelliğine yükleyerek Stream WPF'nin dosyasını açmasını ve dönüştürmesini sağlayabilirsiniz.
Aşağıdaki örnekte, kodu kullanarak doğrudan (pageFrame
) içine Frame nasıl yüklenecek Page gösterilmektedir.
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 AssemblyAssociatedContentFileAttributetanımlandığı gibi, bunların birlikte dağıtıldığı derlemelerle açık bir ilişkiye sahiptir. Ancak, bir derleme ile uygulama veri dosyası arasında örtük veya var olmayan bir ilişki kurmak isteyebileceğiniz zamanlar olabilir, örneğin:
Derleme zamanında bir dosya yoktur.
Derlemenizin çalışma zamanına kadar hangi dosyaları gerektirdiğini bilmiyorsunuz.
İlişkili oldukları derlemeyi yeniden derlemeden dosyaları güncelleştirebilmek istiyorsunuz.
Uygulamanız ses ve video gibi büyük veri dosyaları kullanıyor ve kullanıcıların bunları yalnızca istedikleri zaman indirmesini istiyorsunuz.
Ve düzenleri gibi file:///
http://
geleneksel URI düzenlerini kullanarak bu tür dosyaları yüklemek mümkündür.
<Image Source="file:///C:/DataFile.bmp" />
<Image Source="http://www.datafilewebsite.com/DataFile.bmp" />
Ancak ve http://
düzenleri uygulamanızın file:///
tam güvene sahip olmasını gerektirir. Uygulamanız İnternet'ten 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 izin kümesini istiyorsa, gevşek dosyalar yalnızca uygulamanın kaynak sitesinden (başlatma konumu) yüklenebilir. Bu tür dosyalar kaynak dosyaların sitesi olarak bilinir.
Kısmi güven uygulamalarıyla sınırlı olmamakla birlikte, kaynak dosyaların sitesi kısmi güven uygulamaları için tek seçenek olarak sunulur. Tam güven uygulamalarının derleme zamanında bilmedikleri uygulama veri dosyalarını yüklemesi gerekebilir; tam güven uygulamaları file:/// kullanabilse de, uygulama veri dosyalarının uygulama derlemesi ile aynı klasöre veya bir alt klasörüne yüklenmesi olasıdır. Bu durumda, kaynak site başvurularını kullanmak file:/// kullanmaktan daha kolaydır çünkü file:/// kullanmak dosyanın tam yolunu çalıştırmanızı gerektirir.
Dekont
Kaynak dosyaların sitesi bir istemci makinesinde XAML tarayıcı uygulaması (XBAP) ile önbelleğe alınmazken, içerik dosyaları önbelleğe alınır. Sonuç olarak, bunlar yalnızca özel olarak istendiğinde indirilir. Bir XAML tarayıcı uygulaması (XBAP) uygulamasının büyük medya dosyaları varsa, bunları kaynak dosyalar sitesi olarak yapılandırmak, ilk uygulamanın başlatılmasının çok daha hızlı olduğu ve dosyaların yalnızca isteğe bağlı olarak indirilmesi anlamına gelir.
Kaynak Dosyaların Sitesini Yapılandırma
Kaynak dosya siteniz derleme zamanında mevcut değilse veya bilinmiyorsa, komut satırı programını veya Microsoft Windows Installer'ı kullanmak XCopy
da dahil olmak üzere gerekli dosyaların çalışma zamanında kullanılabilir olduğundan emin olmak için geleneksel dağıtım mekanizmalarını kullanmanız gerekir.
Derleme zamanında kaynak sitede yer almak istediğiniz dosyaları biliyorsanız ancak yine de açık bir bağımlılıktan kaçınmak istiyorsanız, bu dosyaları bir MSBuild projesine öğe olarak None
ekleyebilirsiniz. İçerik dosyalarında olduğu gibi, kaynak dosya sitesinin, değeri veya değeri belirterek Always
yerleşik derlemeye göre bir konuma kopyalandığını belirtmek için MSBuild CopyToOutputDirectory
özniteliğini PreserveNewest
ayarlamanız gerekir.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
...
<None Include="PageSiteOfOriginFile.xaml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
...
</Project>
Dekont
Visual Studio'da, bir projeye dosya ekleyip olarak ayarlayarak Build Action
None
kaynak dosya sitesi oluşturursunuz.
Proje oluşturulduğunda, MSBuild belirtilen dosyaları derleme çıktı klasörüne kopyalar.
Kaynak Dosyaların Sitesini Kullanma
Bir kaynak site dosyasını yüklemek için sınıfının yöntemini Application çağırabilir GetRemoteStream ve istenen kaynak dosya sitesini tanımlayan bir paket URI'sini geçirebilirsiniz. GetRemoteStream , kaynak dosyanın sitesini bir StreamResourceInfo olarak kullanıma sunan ve içerik türünü açıklayan bir Stream nesne döndürür.
Örnek olarak, aşağıdaki kod kaynak dosyanın sitesini yüklemek Page ve bir (pageFrame
öğesinin içeriği Frame olarak ayarlamak için nasıl kullanılacağını GetRemoteStream 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ı GetRemoteStream özelliğine Streamerişmenizi sağlarken, bunu ayarladığınız özelliğin türüne dönüştürmek için ek çalışma yapmanız gerekir. Bunun yerine, kod kullanarak bir kaynak dosyasını doğrudan türün özelliğine yükleyerek Stream WPF'nin dosyasını açmasını ve dönüştürmesini sağlayabilirsiniz.
Aşağıdaki örnekte, kodu kullanarak doğrudan (pageFrame
) içine Frame nasıl yüklenecek Page gösterilmektedir.
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 örneğin işaretleme eşdeğeridir.
<Frame Name="pageFrame" Source="pack://siteoforigin:,,,/SiteOfOriginFile.xaml" />
Derleme Türü Değiştirildikten Sonra Yeniden Oluşturma
Bir uygulama veri dosyasının derleme türünü değiştirdikten sonra, bu değişikliklerin uygulandığından emin olmak için uygulamanın tamamını yeniden oluşturmanız gerekir. Uygulamayı yalnızca derlediyseniz, değişiklikler uygulanmaz.
Ayrıca bkz.
.NET Desktop feedback