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 ActionResourcebir 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 ActionContentbir içerik dosyası oluşturursunuz ve bunu Copy alwaysCopy to Output Directory (ile Alwaysaynı) ve Copy if newer (ile PreserveNewestaynı) 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 ActionNonekaynak 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.