Aracılığıyla paylaş


WPF Uygulama Kaynağı, İçeriği 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. Kaynak dosya orijin sitesi için, bir derleme, bu dosyalar hakkında hiçbir bilgiye sahip olmayabilir veya paket tekdüzen kaynak tanımlayıcı (URI) aracılığıyla örtük bilgiler taşıyabilir; ikinci durumda, başvuruda bulunulan orijin dosya sitesinin gerçekten var olduğuna dair bir 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ış).

Uyarı

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>

Uyarı

Visual Studio'da bir projeye dosya ekleyip Build Action'i Resource olarak ayarlayarak bir kaynak dosyası oluşturursunuz.

Proje oluşturulduğunda MSBuild, kaynağı derleme içine derler.

Kaynak Dosyalarını Kullanma

Kaynak dosyasını yüklemek için, istenen kaynak dosyasını tanımlayan bir paket URI'sini geçirerek, GetResourceStream sınıfının Application yöntemini çağırabilirsiniz. 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 GetResourceStream bir Page kaynak dosyasını yüklemek ve bunu Frame (pageFrame) içeriği olarak ayarlamak için nasıl kullanabileceğinizi 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, kodla bir kaynak dosyasını doğrudan bir türün özelliğine yükleyerek WPF'nin Stream dosyasını açmasını ve dönüştürmesini sağlayabilirsiniz.

Aşağıdaki örnek, kod kullanarak Page öğesini doğrudan Frame (pageFrame) içine nasıl yükleyeceğinizi gösterir.

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>

Uyarı

Visual Studio'da bir projeye yeni Window, NavigationWindow, Page, FlowDocument veya ResourceDictionary eklediğinizde, işaretleme dosyası için Build Action varsayılan olarak Page olur.

Öğeleri olan Page bir proje derlendiğinde, XAML öğeleri ikili biçime dönüştürülür ve ilişkili kütüphaneye derlenir. Sonuç olarak, bu dosyalar tipik kaynak dosyalarıyla aynı şekilde kullanılabilir.

Uyarı

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. Her ne kadar bir derlemenin içine derlenmese de, derlemeler, her bir içerik dosyası ile ilişki kuran 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. Projede her derleme yapıldığında kaynağın derleme çıktı klasörüne kopyalanmasını istiyorsanız, CopyToOutputDirectory meta veri öğesini Always değeriyle ayarlarsınız. Aksi takdirde, PreserveNewest değeri kullanarak kaynağın sadece en yeni sürümünün derleme çıktı klasörüne kopyalanmasını sağlayabilirsiniz.

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>

Uyarı

Visual Studio'da, bir projeye dosya ekleyerek ve içerik dosyasının Build Action'ini Content olarak ayarlayıp, Copy to Output Directory'ini Copy always (Always ile aynı) ve Copy if newer (PreserveNewest ile aynı) olarak ayarlayarak bir içerik dosyası oluşturursunuz.

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 GetContentStream sınıfının Application yöntemini çağırabilir 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 GetContentStream içerik dosyasını yüklemek ve bunu Page içeriği (Frame olarak ayarlamak için pageFrame nasıl kullanılacağı gösterilmektedir.

// 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, kodla bir kaynak dosyasını doğrudan bir türün özelliğine yükleyerek WPF'nin Stream dosyasını açmasını ve dönüştürmesini sağlayabilirsiniz.

Aşağıdaki örnek, kod kullanarak Page öğesini doğrudan Frame (pageFrame) içine nasıl yükleyeceğinizi gösterir.

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ı, dağıtıldıkları derlemelerle AssemblyAssociatedContentFileAttribute tarafından tanımlanan 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.

Geleneksel URI düzenleri olan file:/// ve http:// 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 file:/// ve http:// düzenleri uygulamanızın tam güven gerektirmesini sağlar. 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ı için tek seçenek olmasına rağmen, kaynak dosya konumları yalnızca kısmi güven uygulamalarıyla sınırlı değildir. 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.

Uyarı

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, MSBuild CopyToOutputDirectory özniteliğini ayarlamanız ve kaynak dosya sitesinin Always veya PreserveNewest değerini belirterek yerleşik derlemeye göre göreli bir konuma kopyalandığını belirtmeniz gerekir.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
  ...
  <None Include="PageSiteOfOriginFile.xaml">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </None>
  ...
</Project>

Uyarı

Visual Studio'da, bir projeye dosya ekleyip Build Action değerini None olarak ayarlayarak bir kaynak konumu dosyası 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 GetRemoteStream sınıfının Application yöntemini çağırabilir ve istenen kaynak site dosyasını tanımlayan bir paket URI'sini geçirebilirsiniz. GetRemoteStream, kaynağın dosya sitesini 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 kaynak dosyanın sitesini GetRemoteStream yüklemek ve bunu bir Page (Frame) içeriği olarak ayarlamak için pageFrame kullanımını 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, kodla bir kaynak dosyasını doğrudan bir türün özelliğine yükleyerek WPF'nin Stream dosyasını açmasını ve dönüştürmesini sağlayabilirsiniz.

Aşağıdaki örnek, kod kullanarak Page öğesini doğrudan Frame (pageFrame) içine nasıl yükleyeceğinizi gösterir.

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" />

Yapı Türü Değiştirildikten Sonra Yeniden İnşa Etme

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 bakınız