Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Important
Cihaz meta verileri kullanım dışıdır ve windows'un gelecek bir sürümünde kaldırılacaktır. Bu işlevin değiştirilmesi hakkında bilgi için bkz . Sürücü Paketi Kapsayıcı Meta Verileri.
Windows 8.1'de UWP cihaz uygulamaları, yazıcı üreticilerinin gelişmiş yazdırma ayarlarını görüntüleyen açılır öğeyi özelleştirmesine olanak sağlar. Bu konu başlığında gelişmiş yazdırma ayarları açılır öğesi tanıtılır ve Yazdırma ayarları ve yazdırma bildirimleri örneğinin C# sürümünün varsayılan açılır öğeyi özel bir açılır öğeyle nasıl değiştirlediği gösterilir. Genel olarak UWP cihaz uygulamaları hakkında daha fazla bilgi edinmek için bkz. UWP cihaz uygulamalarıyla tanışın.
Yazdırma ayarları ve yazdırma bildirimleri örneğinin C# sürümü, gelişmiş yazdırma ayarları için özel bir açılır öğe kullanıcı arabirimini göstermek için Preferences.xaml sayfasını kullanır. Yazdırma yardımcı sınıfı, bir cihaz bağlamı (IPrinterExtensionContext) oluşturmak ve cihaz sorgularını gerçekleştirmek için kullanılır. The PrinterHelperClass.cs file is in the DeviceAppForPrintersLibrary project and uses APIs defined in the PrinterExtensionLibrary project. Yazıcı uzantısı kitaplığı, v4 yazdırma sürücüsünün yazıcı uzantısı arabirimlerine erişmek için kullanışlı bir yol sağlar. Daha fazla bilgi için Yazıcı uzantısı kitaplığına genel bakış bölümüne bakın.
Note
Bu konuda gösterilen kod örnekleri, Yazdırma ayarları ve yazdırma bildirimleri örneğin C# sürümünü temel alır. Bu örnek JavaScript ve C++ ile de kullanılabilir. C++ COM'a doğrudan erişebildiğinden, örneğin C++ sürümünün kod kitaplığı projelerini içermediğini unutmayın. Kodun en son sürümlerini görmek için örnekleri indirin.
Gelişmiş yazdırma ayarları
Gelişmiş yazdırma ayarları deneyimi, bir kullanıcı Yazdır penceresinde sunulmayan yazdırma ayarlarını seçmek istediğinde yazıcının sunduğu işlevselliktir. It is accessible through the More settings link in the Print window. Tam ekran deneyimi değildir, ancak bir kullanıcı dış alana tıkladığında veya dokunduğunda kapatılan basit, bağlamsal bir kullanıcı arabirimini görüntüleme denetimi olan bir açılır pencere içinde görüntülenir.
Bu deneyim, belge sayfasına filigran uygulama, güvenli yazdırma seçenekleri veya görüntü geliştirme seçenekleri sunma gibi yazıcınızın farklı özelliklerini vurgulamak için kullanılabilir.
Bir yazıcı için UWP cihaz uygulaması yüklenmediğinde, Windows varsayılan yazdırma ayarları deneyimi sağlar. Windows, yazıcınız için bir UWP cihaz uygulamasının yüklü olduğunu ve uygulamanın uzantıyı windows.printTaskSettings kabul ettiğini algılarsa, uygulamanız Windows tarafından sağlanan varsayılan deneyimin yerini alır.
Gelişmiş yazdırma ayarları için açılır öğeyi çağırmak için:
Yazdırmayı destekleyen bir UWP uygulaması açma
Ekranın sağ tarafında kaydırarak (ya da Windows Logo Tuşu + C kullanarak) charms'a erişin.
Tap the Devices charm
Tap Print
Yazıcıya dokunma
The Print window opens
Click the More settings link on the Print window
Gelişmiş yazdırma ayarları açılır öğesi açılır durumda.
The default flyout appears when no UWP device app for the printer is installed
A custom flyout appears when a UWP device app for the printer is installed
Prerequisites
Başlamadan önce:
Yazıcınızın bir v4 yazdırma sürücüsü kullanılarak yüklendiğinden emin olun. Daha fazla bilgi için bkz. v4 yazdırma sürücüleri geliştirme.
Geliştirme bilgisayarınızı ayarlayın. See Getting started for info about downloading the tools and creating a developer account.
Uygulamanızı mağazayla ilişkilendirin. Daha fazla bilgi için bkz. UWP cihaz uygulaması oluşturun.
Yazıcınızı uygulamanızla ilişkilendiren cihaz meta verileri oluşturun. Bu konuda daha fazla bilgi için bkz. Cihaz meta verileri oluşturma.
Uygulamanızın ana sayfası için kullanıcı arabirimini oluşturun. Tüm UWP cihaz uygulamaları Başlangıç ekranından başlatılabilir ve tam ekran olarak görüntülenir. Ürün veya hizmetlerinizi, cihazlarınızın belirli markalarına ve özelliklerine uygun şekilde vurgulamak için Başlangıç deneyimini kullanın. Kullanabileceği kullanıcı arabirimi denetimlerinin türüyle ilgili özel bir kısıtlama yoktur. Tam ekran deneyiminin tasarımını kullanmaya başlamak için Microsoft Store tasarım ilkelerine bakın.
If you're writing your app with C# or JavaScript, add the PrinterExtensionLibrary and DeviceAppForPrintersLibrary projects to your UWP device app solution. Bu projelerin her birini yazdırma ayarları ve yazdırma bildirimleri örneğinde bulabilirsiniz.
Note
C++ COM'a doğrudan erişebildiğinden, C++ uygulamaları COM tabanlı yazıcı cihaz bağlamıyla çalışmak için ayrı bir kitaplık gerektirmez.
1. Adım: Uzantıyı kaydetme
Windows'un uygulamanın gelişmiş yazdırma ayarları için özel bir açılır öğe sağlayabildiğini fark edebilmesi için yazdırma görevi ayarları uzantısını kaydetmesi gerekir. Bu uzantı, Extension değerine ayarlanmış bir Category özniteliği ile windows.printTaskSettings öğesinde bildirilir. C# ve C++ örneklerinde Executable özniteliği $targetnametoken$.exe olarak, EntryPoint özniteliği ise DeviceAppForPrinters.App olarak ayarlanır.
You can add the print task settings extension on the Declarations tab of the Manifest Designer in Microsoft Visual Studio. Xml (Metin) Düzenleyicisi'ni kullanarak uygulama paketi bildirim XML'sini el ile de düzenleyebilirsiniz. Right-click the Package.appxmanifest file in Solution Explorer for editing options.
This example shows the print task settings extension in the Extension element, as it appears in the app package manifest file, Package.appxmanifest.
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
<Identity Name="Microsoft.SDKSamples.DeviceAppForPrinters.CS" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" Version="1.0.0.0" />
<Properties>
<DisplayName>Device App For Printers C# sample</DisplayName>
<PublisherDisplayName>Microsoft Corporation</PublisherDisplayName>
<Logo>Assets\storeLogo-sdk.png</Logo>
</Properties>
<Prerequisites>
<OSMinVersion>6.3.0</OSMinVersion>
<OSMaxVersionTested>6.3.0</OSMaxVersionTested>
</Prerequisites>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="DeviceAppForPrinters" Executable="$targetnametoken$.exe" EntryPoint="DeviceAppForPrinters.App">
<VisualElements DisplayName="Device App For Printers C# sample" Logo="Assets\squareTile-sdk.png" SmallLogo="Assets\smallTile-sdk.png" Description="DeviceAppForPrinters C# sample" ForegroundText="light" BackgroundColor="#00b2f0" ToastCapable="true">
<DefaultTile ShowName="allLogos" ShortName="App4PrinterCS" WideLogo="Assets\tile-sdk.png" />
<SplashScreen Image="Assets\splash-sdk.png" BackgroundColor="#00b2f0" />
</VisualElements>
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTask.PrintBackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.printTaskSettings" Executable="$targetnametoken$.exe" EntryPoint="DeviceAppForPrinters.App" />
</Extensions>
</Application>
</Applications>
</Package>
2. Adım: Kullanıcı arabirimini oluşturma
Uygulamanızı oluşturmadan önce kullanıcı deneyimini tasarlamak için tasarımcılarınız ve pazarlama ekibinizle birlikte çalışmanız gerekir. Kullanıcı deneyimi, şirketinizin marka özelliklerini yansıtmalı ve kullanıcılarınızla bağlantı kurmanıza yardımcı olmalıdır.
Design guidelines
Özel açılır öğenizi tasarlamadan önce UWP uygulaması açılır öğesi yönergelerini gözden geçirmeniz önemlidir. Yönergeler, açılır öğenizin diğer UWP uygulamalarıyla tutarlı sezgisel bir deneyim sağlamasına yardımcı olur.
Uygulamanızın ana sayfasında, Windows 8.1'in tek bir monitörde çeşitli boyutlarda birden çok uygulama görüntüleyebileceğini unutmayın. Uygulamanızın ekran boyutları, pencere boyutları ve yönlendirmeler arasında uygun bir şekilde nasıl yeniden düzenleyebileceği hakkında daha fazla bilgi edinmek için aşağıdaki rehberlere bakın.
Flyout dimensions
Gelişmiş yazdırma ayarlarını görüntüleyen açılır öğe 646 piksel genişliğinde ve en az 768 piksel yüksekliğindedir (gerçek yükseklik, kullanıcının ekranının çözünürlüğüne bağlıdır). Açılır öğe başlık alanındaki Geri düğmesi Windows tarafından sağlanır. "Uygulama Başlığı" metni, uygulama bildirimindeki uygulama başlığıdır. Başlık alanı 80 piksel yüksekliğindedir ve özelleştirilmiş açılır pencerenin görüntülenebilir alanı için 688 piksel bırakır.
Note
Özel açılır pencerenizin yüksekliği 688 pikselden fazlaysa, kullanıcı açılır pencerenin görünür alanın üstünde veya altında kalan kısımlarını kaydırarak veya kaydırarak görüntüleyebilir.
Uygulama başlığı rengini ve simgesini tanımlama
Özel açılır öğedeki başlık, arka plan rengi, metin rengi ve küçük logo, uygulama paketi manifest dosyasındaki VisualElements öğesinden alınır.
This example shows the title and icon, as defined in the VisualElements element, in the app package manifest file (Package.appxmanifest).
<VisualElements DisplayName="Device App For Printers C# sample" Logo="Assets\squareTile-sdk.png" SmallLogo="Assets\smallTile-sdk.png" Description="DeviceAppForPrinters C# sample" ForegroundText="light" BackgroundColor="#00b2f0" ToastCapable="true">
<DefaultTile ShowName="allLogos" ShortName="App4PrinterCS" WideLogo="Assets\tile-sdk.png" />
<SplashScreen Image="Assets\splash-sdk.png" BackgroundColor="#00b2f0" />
</VisualElements>
Best practices
Aynı görünüm ve hissi koruyun. Özel açılır öğenizi, yazı tipleri, renkler ve denetimler gibi öğeler de dahil olmak üzere Başlangıç deneyiminiz için tasarımla (uygulamanızın Ana sayfası) hizalayın. Uygulama, nereden çağrıldığından bağımsız olarak kişilere tanıdık geliyor olmalıdır.
Etkileşimleri basit tutun. Zaman alan veya karmaşık etkileşimlerden kaçının. Çoğu durumda, yazıcı ayarlama, durumu görüntüleme, mürekkep sıralama ve sorun giderme gibi eylemler başlangıç deneyiminde en iyi şekilde gerçekleştirilir.
Navigasyonu en düşük düzeyde tutun. Kullanıcılarınızın özel açılır öğenizdeki birden çok sayfa arasında ileri geri gezinmelerini sağlamaktan kaçının. Bunun yerine, aşamalı açıklama denetimleri, açılan menüler ve satır içi hata iletileri gibi dikey kaydırma veya satır içi denetimleri kullanın.
Light dismiss özellikli açılırları kullanmayın. Yazdırma deneyimi zaten açık kapatma açılır öğesini kullanıyor. Özel açılır öğenize başka bir ışık kapatma öğesi dahil olmak kullanıcılarınızın kafasını karıştırabilir.
Kullanıcıları yazdırma deneyiminden uzaklaştıran bağlantıları devre dışı bırakın. Bir kullanıcı içeriği yazdırırken, onun yazdırma bağlamında kalmasını sağlamak için gerekli adımları atmalısınız. Örneğin, uygulamanızın diğer alanlarına (örneğin, giriş sayfasına veya mürekkep satın almak için bir sayfaya) yönlendiren bağlantıları varsa, kullanıcının gelişmiş yazdırma ayarları deneyimini yanlışlıkla bırakmaması için bunları devre dışı bırakmanız gerekir.
3. Adım: Etkinleştirmeyi işleme
Uygulamanız yazdırma görevi ayarları uzantısını bildirdiyse, uygulamanın Etkinleştirme olayını işlemek için bir OnActivated yöntem uygulaması gerekir. Uygulama etkinleştirme, uygulama başladıktan sonra hangi sayfanın başlatılacağını uygulamanızın seçebileceği zamandır. Yazdırma görevi ayarları uzantısını bildirmiş uygulamalar için Windows, Etkin olay bağımsız değişkenlerinde yazdırma görevi uzantısı bağlamını geçirir: Windows.ApplicationModel.Activation.IActivatedEventArgs.
A UWP device app can determine that the activation is intended for advanced print settings (that someone just tapped More options on the print settings dialog) when the event argument's kind property is equal to Windows.ApplicationModel.Activation.ActivationKind.printTaskSettings.
Note
Bazı durumlarda, kullanıcı uygulamayı başlatıldıktan hemen sonra kapatıyorsa, etkinleştirme işleyicisinin içinde bir özel durum oluşturulabilir. Bunu önlemek için etkinleştirme işleyicinizin verimli bir şekilde tamamlandığından ve yoğun kaynak işleme gerçekleştirmediğinden emin olun.
This example shows the activation event handler in the OnActivated method, as it appears in the Constants.cs file. Ardından olay bağımsız değişkenleri Windows.ApplicationModel.Activation.PrintTaskSettingsActivatedEventArgs olarak dönüştürülür. Although the sample includes this code in the Constants.cs file, it's actually part of the App class that is also defined in the App.xaml.cs file.
partial class App : Application
{
protected override void OnActivated(IActivatedEventArgs args)
{
if (args.Kind == ActivationKind.PrintTaskSettings)
{
Frame rootFrame = new Frame();
if (null == Window.Current.Content)
{
rootFrame.Navigate(typeof(MainPage));
Window.Current.Content = rootFrame;
}
Window.Current.Activate();
MainPage mainPage = (MainPage)rootFrame.Content;
// Load advanced printer preferences scenario
mainPage.LoadAdvancedPrintSettingsContext((PrintTaskSettingsActivatedEventArgs)args);
}
}
}
4. Adım: Görüntü ayarları
LoadAdvancedPrintSettingsContext Yöntemi çağrıldığında, yazdırma görevi yapılandırma bağlamı MainPage sınıfının değişkenlerine atanır. Bu, özel açılır pencere başlatıldığında yazdırma ayarlarına erişmesini sağlar.
LoadAdvancedPrintSettingsContext yöntemine geçirilen olay bağımsız değişkenleri, yazıcıya erişmek ve yazıcıyı denetlemek için özellikleri kullanıma sunar.
- The args.configuration property provides an object of type Windows.Devices.Printers.Extensions.PrintTaskConfiguration. Bu nesne, yazdırma görevi uzantısı bağlamı için erişim sağlar ve ayrıca yazdırma biletini güncelleştirmek için bir olay işleyicisi eklemenize olanak tanır.
- The args.configuration.printerExtensionContext property provides an object of type Windows.Devices.Printers.Extensions.PrinterExtensionContext. Bu nesne, Yazdırma Şeması, PrintTicket ve yazdırma kuyruğu bilgileri için PrinterExtensionLibrary arabirimlerine yönelik bir işaretçidir. Hiçbir arabirim gösterilmezse null olur. Daha fazla bilgi için bkz. Yazıcı uzantısı kitaplığına genel bakış.
This example shows the LoadAdvancedPrintSettingsContext method, as it appears in the Constants.cs file.
public PrintTaskConfiguration Config;
public Object Context;
public void LoadAdvancedPrintSettingsContext(PrintTaskSettingsActivatedEventArgs args)
{
Config = args.Configuration;
Context = Config.PrinterExtensionContext;
LoadScenario(typeof(DeviceAppForPrinters.Preferences));
}
On the custom flyout page, Preferences.xaml.cs, a class named rootPage acts as a pointer to the MainPage class so that the print task extension context and the printer device context can be accessed from the flyout.
This example shows the pointer in a portion of Preferences class, from the Preferences.xaml.cs file.
Yazdırma ayarları ve bildirim örneğini indirerek tam kodu görün.
public sealed partial class Preferences : SDKTemplate.Common.LayoutAwarePage
{
// A pointer back to the main page.
MainPage rootPage = MainPage.Current;
// To listen for save requests.
PrintTaskConfiguration configuration;
// To create the printer device context.
Object printerExtensionContext;
PrintHelperClass printHelper;
// The features in this sample were chosen because they're available on a wide range of printer drivers.
private string[] features = { "PageOrientation", "PageOutputColor", "PageMediaSize", "PageMediaType" };
private string[] selections = { null, null, null, null };
// . . .
// . . .
// . . .
When the page constructor for Preferences.xaml.cs is called, objects are created for the print task extension context (a PrintTaskConfiguration object named configuration) and the printer device context (a PrintHelperClass object named printHelper).
Bu nesneler oluşturulduktan sonra, DisplaySettings yönteminde yazıcı cihazı bağlamı, TextBlocks ve ComboBoxes'ı yüklemek için kullanılır. JavaScript'in aksine, seçimdeki değişikliklerin, uygulamanın geri kalanındaki işlemlerle aynı iş parçacığında tetiklenmediğini unutmayın. Daha sonra kullanmak üzere kullanıcı seçimlerinin yerel önbelleğini tutmanız gerekir.
This example shows the custom flyout page constructor, DisplaySettings, and other helper methods in the Preferences.xaml.cs file.
public Preferences()
{
this.InitializeComponent();
configuration = rootPage.Config;
printerExtensionContext = rootPage.Context;
printHelper = new PrintHelperClass(printerExtensionContext);
// Disable scenario navigation by hiding the scenario list UI elements
((UIElement)rootPage.FindName("Scenarios")).Visibility = Windows.UI.Xaml.Visibility.Collapsed;
((UIElement)rootPage.FindName("ScenarioListLabel")).Visibility = Windows.UI.Xaml.Visibility.Collapsed;
((UIElement)rootPage.FindName("DescriptionText")).Visibility = Windows.UI.Xaml.Visibility.Collapsed;
DisplaySettings();
}
private void DisplaySettings(bool constraints=false)
{
PrintOptions.Visibility = Windows.UI.Xaml.Visibility.Visible;
WaitPanel.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
// Fill in the drop-down select controls for some common printing features.
TextBlock[] featureLabels = { PageOrientationLabel, PageOutputColorLabel, PageMediaSizeLabel, PageMediaTypeLabel };
ComboBox[] featureBoxes = { PageOrientationBox, PageOutputColorBox, PageMediaSizeBox, PageMediaTypeBox };
for (int i = 0; i < features.Length; i++)
{
// Only display a feature if it exists
featureLabels[i].Visibility = Windows.UI.Xaml.Visibility.Collapsed;
featureBoxes[i].Visibility = Windows.UI.Xaml.Visibility.Collapsed;
string feature = features[i];
// Check whether the currently selected printer's capabilities include this feature.
if (!printHelper.FeatureExists(feature))
{
continue;
}
// Fill in the labels so that they display the display name of each feature.
featureLabels[i].Text = printHelper.GetFeatureDisplayName(feature);
string[] index = printHelper.GetOptionInfo(feature, "Index");
string[] displayName = printHelper.GetOptionInfo(feature, "DisplayName");
string selectedOption = printHelper.GetSelectedOptionIndex(feature);
// Unless specified, do not get constraints
bool[] constrainedList = constraints ? printHelper.GetOptionConstraints(feature) : new bool[index.Length];
// Populate the combo box with the options for the current feature.
PopulateBox(featureBoxes[i], index, displayName, selectedOption, constrainedList);
selections[i] = selectedOption;
// Every time the selection for a feature changes, we update our local cached set of selections.
featureBoxes[i].SelectionChanged += OnFeatureOptionsChanged;
// Show existing features
featureLabels[i].Visibility = Windows.UI.Xaml.Visibility.Visible;
featureBoxes[i].Visibility = Windows.UI.Xaml.Visibility.Visible;
}
}
void PopulateBox(ComboBox box, string[] index, string[] displayName, string selectedOption, bool[] constrainedList)
{
// Clear the combobox of any options from previous UI refresh before repopulating it.
box.SelectionChanged -= OnFeatureOptionsChanged;
box.Items.Clear();
// There should be only one displayName for each possible option.
if (index.Length == displayName.Length)
{
for (int i = 0; i < index.Length; i++)
{
// Create a new DisplayItem so the user will see the friendly displayName instead of the index.
ComboBoxItem newItem = new ComboBoxItem();
newItem.Content = displayName[i];
newItem.DataContext = index[i];
newItem.Foreground = constrainedList[i] ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.Black);
box.Items.Add(newItem);
// Display current selected option as selected in the combo box.
if (selectedOption == index[i])
{
box.SelectedIndex = i;
box.Foreground = newItem.Foreground;
}
}
}
}
private void OnFeatureOptionsChanged(object sender, SelectionChangedEventArgs args)
{
ComboBox comboBox = sender as ComboBox;
for (int i = 0; i < features.Length; i++)
{
if (features[i] + "Box" == comboBox.Name)
{
selections[i] = (comboBox.SelectedItem as ComboBoxItem).DataContext as string;
}
}
}
5. Adım: Ayarları kaydetme
When the user has finished setting advanced print settings, the Microsoft Store device app needs to save the changes before the user goes back to the Print window. To do that, the app needs to listen for when the user taps the Back button (from the custom flyout page). Bu durumda, yazdırma görevi uzantısı bağlamındaki (SaveRequested nesne) configuration olayı tetiklenir.
This example shows the event listener for SaveRequested, being added in the OnNavigatedTo event handler of the custom flyout, in the Preferences.xaml.cs file. When the SaveRequested event is triggered, the OnSaveRequested method will be invoked (that method is also in the Preferences.xaml.cs file).
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (null == configuration)
{
rootPage.NotifyUser("Configuration arguments cannot be null", NotifyType.ErrorMessage);
return;
}
// Add an event listener for saverequested (the back button of the flyout is pressed).
configuration.SaveRequested += OnSaveRequested;
}
OnSaveRequested yönteminde, uygulama ilk olarak printHelper nesnesini kullanarak yazıcı uzantısı bağlamındaki her özellik için şu anda seçili olan seçenekleri ayarlar. Ardından, Save yöntemine bağımsız değişken olarak geçirilen request nesnesi üzerinde OnSaveRequested yöntemini çağırır.
Save Windows.Devices.Printers.Extensions.PrintTaskConfigurationSaveRequest sınıfından yöntemi, yazdırma biletini doğrulamak ve yazdırma görevi yapılandırmasını kaydetmek için yazıcı uzantısı bağlamını kullanır.
Important
Yazdırma bileti herhangi bir şekilde geçersizse, Save yöntemi uygulamanın işlemelisi gereken bir istisna fırlatır. Uygulama özel durumu işlemezse akış durdurulur ve kullanıcıyı açılır öğeyi kapatmaya ve yazdırma akışını yeniden başlatmaya zorlar.
This example shows the OnSaveRequested method in the Preferences.xaml.cs file.
SaveRequested Etkinlik UI iş parçacığında tetiklenmediğinden, bileti doğrulayıp kaydederken uygun iletileri görüntülemek için kullanıcı arabirimi (UI) iş parçacığına ileti göndermek amacıyla Windows.UI.Core.CoreDispatcher kullanması gerekir.
async private void OnSaveRequested(object sender, PrintTaskConfigurationSaveRequestedEventArgs args)
{
if (null == printHelper || null == printerExtensionContext || null == args)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
rootPage.NotifyUser("onSaveRequested: args, printHelper, and context cannot be null", NotifyType.ErrorMessage);
});
return;
}
// Get the request object, which has the save method that allows saving updated print settings.
PrintTaskConfigurationSaveRequest request = args.Request;
if (null == request)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
rootPage.NotifyUser("onSaveRequested: request cannot be null", NotifyType.ErrorMessage);
});
return;
}
PrintTaskConfigurationSaveRequestedDeferral deferral = request.GetDeferral();
// Two separate messages are dispatched to:
// 1) put up a popup panel,
// 2) set the each options to the print ticket and attempt to save it,
// 3) tear down the popup panel if the print ticket could not be saved.
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
PrintOptions.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
WaitPanel.Visibility = Windows.UI.Xaml.Visibility.Visible;
});
// Go through all the feature select elements, look up the selected
// option name, and update the context
// for each feature
for (var i = 0; i < features.Length; i++)
{
// Set the feature's selected option in the context's print ticket.
// The printerExtensionContext object is updated with each iteration of this loop
printHelper.SetFeatureOption(features[i], selections[i]);
}
bool ticketSaved;
try
{
// This save request will throw an exception if ticket validation fails.
// When the exception is thrown, the app flyout will remain.
// If you want the flyout to remain regardless of outcome, you can call
// request.Cancel(). This should be used sparingly, however, as it could
// disrupt the entire the print flow and will force the user to
// light dismiss to restart the entire experience.
request.Save(printerExtensionContext);
if (configuration != null)
{
configuration.SaveRequested -= OnSaveRequested;
}
ticketSaved = true;
}
catch (Exception exp)
{
// Check if the HResult from the exception is from an invalid ticket, otherwise rethrow the exception
if (exp.HResult.Equals(unchecked((int)0x8007000D))) // E_INVALID_DATA
{
ticketSaved = false;
}
else
{
throw;
}
}
// If ticket isn't saved, refresh UI and notify user
if (!ticketSaved)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
rootPage.NotifyUser("Failed to save the print ticket", NotifyType.ErrorMessage);
DisplaySettings(true);
});
}
deferral.Complete();
}
Kullanıcı girişi gerektiren kaydetme seçenekleri
Yazdırma ayarları ve yazdırma bildirimleri örneği, çoğu yazdırma seçeneğini kapsayan tanımlı özelliklerin nasıl ayarlandığını gösterir. Ancak, bazı seçenekler kullanıcı tarafından belirtilen bir değeri almak için özel bir kullanıcı arabirimi gerektirir. Örneğin, bir uygulama özel sayfa boyutu belirtmek için gelişmiş yazdırma ayarlarını kullandıysa, kullanıcı tarafından belirtilen değeri kaydetmek için şu adımları uygular:
Uygulama açılışı sırasında yazdırma biletini alın. Yazdırma ayarları için uygulama etkinleştirme, daha önce 3. Adım: Etkinleştirmeyi işleme bölümünde açıklanmıştır.
Sayfa boyutu seçeneğinin belirtilip belirtilmediğinden denetleyin. C# veya JS uygulamasında, yazdırma yardımcısı sınıfı bu seçeneği denetleyebilir. C++ uygulamasında IPrintSchemaPageMediaSizeOption'ı almak için IPrintSchemaOption'da QueryInterface öğesini çağırabilirsiniz.
Bu örnekte, yazdırma yardımcısı sınıfında sayfa boyutu seçeneğinin belirtilip belirtilmedidiğini denetleen bir yöntem gösterilmektedir.
public bool ShouldShowCustomUI(string index) { if (null != index) { string feature = "PageMediaSize"; int i = int.Parse(index); IPrintSchemaOption selectedOption = GetCachedFeatureOptions(feature)[i]; if (selectedOption.Name.Equals("CustomMediaSize", StringComparison.CurrentCulture) || selectedOption.Name.Equals("PSCustomMediaSize", StringComparison.CurrentCulture)) { return true; } } return false; }Özel açılır listede, kullanıcıdan sayfa yüksekliğini ve genişliğini soran özel bir kullanıcı arabirimi görüntüleyin ve IPrintSchemaPageMediaSizeOption'dan kullanıcı tarafından belirtilen yükseklik ve genişliği alın.
Bu örnek, kullanıcıdan sayfa yüksekliği ve genişliği isteyen özel bir açılır öğe için bir yöntem gösterir.
private void ShowCustomPageMediaSizeUI(string index, bool keepValue) { //Hide custom media size UI unless needed if (IsCustomSizeSelected(index)) { if (keepValue && (!customWidth.Equals("")) && (!customHeight.Equals(""))) { CustomWidthBox.Text = customWidth; CustomHeightBox.Text = customHeight; } else { // Use a helper function from the WinRT helper component CustomWidthBox.Text = printHelper.GetCustomWidth(index); CustomHeightBox.Text = printHelper.GetCustomHeight(index); } CustomUIPanel.Visibility = Windows.UI.Xaml.Visibility.Visible; CustomWidthBox.KeyDown += OnCustomValueEntered; CustomHeightBox.KeyDown += OnCustomValueEntered; } else { CustomUIPanel.Visibility = Windows.UI.Xaml.Visibility.Collapsed; CustomWidthBox.KeyDown -= OnCustomValueEntered; CustomHeightBox.KeyDown -= OnCustomValueEntered; } }IPrintSchemaPageMediaSizeOptionnesnesini kullanıcı tarafından belirtilen değerlerle güncelleştirin ve yüksekliğin ve genişliğin kullanıcı tarafından belirtilen değerlerle eşleşip eşleşmediğini doğrulayın.Bu örnek, bir yazıcı yardımcı sınıfındaki
IPrintSchemaPageMediaSizeOptionnesneyi güncelleştirmek için bir yardımcı yöntemdir.OnSaveRequestedÖzel açılır öğedeki işleyici, özel sayfa boyutu seçeneğinin istendiğini belirlerse bu işlevi çağırır.public void SetCustomMediaSizeDimensions(string width, string height) { if ((null == width) && (null == height) && (null == Capabilities)) { return; } try { CheckSizeValidity(width, height); } catch (FormatException e) { throw new ArgumentException(e.Message); } catch (OverflowException e) { throw new ArgumentException(e.Message); } // The context is retrieved during app activation. IPrintSchemaTicket ticket = context.Ticket; // // Input XML as Stream // XElement ticketRootXElement = null; using (Stream ticketReadStream = ticket.GetReadStream()) { ticketRootXElement = XElement.Load(ticketReadStream); } XNamespace psfNs = PrintSchemaConstants.FrameworkNamespaceUri; XNamespace pskNs = PrintSchemaConstants.KeywordsNamespaceUri; string pskPrefix = ticketRootXElement.GetPrefixOfNamespace(pskNs); // Modify the MediaSizeHeight and MediaSizeWidth IEnumerable<XElement> parameterInitCollection = from c in ticketRootXElement.Elements(psfNs + "ParameterInit") select c; foreach (XElement parameterInit in parameterInitCollection) { if (0 == String.Compare((string)parameterInit.Attribute("name"), pskPrefix + ":PageMediaSizePSWidth")) { IEnumerable<XElement> valueCollection = from c in parameterInit.Elements(psfNs + "Value") select c; valueCollection.ElementAt(0).Value = width; } else if (0 == String.Compare((string)parameterInit.Attribute("name"), pskPrefix + ":PageMediaSizePSHeight")) { IEnumerable<XElement> valueCollection = from c in parameterInit.Elements(psfNs + "Value") select c; valueCollection.ElementAt(0).Value = height; } } // // Write XLinq changes back to DOM // using (Stream ticketWriteStream = ticket.GetWriteStream()) { ticketRootXElement.Save(ticketWriteStream); } }
Testing
UWP cihaz uygulamanızı test etmeden önce, cihaz meta verileri kullanılarak yazıcınıza bağlanmalıdır.
Cihaz uygulaması bilgilerini buna eklemek için yazıcınızın cihaz meta veri paketinin bir kopyasına ihtiyacınız vardır. Cihaz meta verileriniz yoksa, UWP cihaz uygulamanız için cihaz meta verileri oluşturmakonusunda açıklandığı gibi Cihaz Meta Veri Yazma Sihirbazı kullanarak oluşturabilirsiniz.
Note
Cihaz Meta Veri Yazma Sihirbazı'nı kullanmak için, bu konudaki adımları tamamlamadan önce Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate veya Windows 8.1 içintek başına SDK'yı yüklemeniz gerekir. Windows için Microsoft Visual Studio Express'in yüklenmesi, SDK'nın sihirbazı içermeyen bir sürümünü yükler.
Aşağıdaki adımlar uygulamanızı oluşturur ve cihaz meta verilerini yükler.
Test imzalamayı etkinleştirin.
%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86 klasöründen çift tıklayarak DeviceMetadataWizard.exe dosyasını çalıştırarak Cihaz Meta Verisi Yazma Sihirbazı'nı başlatın.
From the Tools menu, select Enable Test Signing.
Bilgisayarı yeniden başlatın
Çözüm (.sln) dosyasını açarak çözümü oluşturun. F7 tuşuna basın veya örnek yüklendikten sonra üstteki menüden Derleme->Derleme Çözümü gidin.
Yazıcının bağlantısını kesin ve kaldırın. Cihaz bir sonraki algılandığında Windows'un güncelleştirilmiş cihaz meta verilerini okuması için bu adım gereklidir.
Cihaz meta verilerini düzenleyin ve kaydedin. Cihaz uygulamasını cihazınıza bağlamak için cihaz uygulamasını cihazınızla ilişkilendirmeniz gerekir
Note
Cihaz meta verilerinizi henüz oluşturmadıysanız bkz. UWP cihaz uygulamanız için cihaz meta verileri oluşturma.
Cihaz Meta Veri Yazma Sihirbazı henüz açık değilse, DeviceMetadataWizard.exeçift tıklayarak %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86'dan başlatın.
Cihaz Meta Verilerini Düzenle tıklayın. Bu, mevcut cihaz meta veri paketinizi düzenlemenize olanak tanır.
In the Open dialog box, locate the device metadata package associated with your UWP device app. (It has a devicemetadata-ms file extension.)
UWP cihaz uygulaması bilgilerini belirtin sayfasında, UWP cihaz uygulaması kutusuna Microsoft Store uygulama bilgilerini girin. UWP uygulama bildirim dosyasına tıklayın, bu işlem Paket adı, Yayıncı adıve UWP uygulama kimliğibilgilerini otomatik olarak dolduracaktır.
If your app is registering for printer notifications, fill out the Notification handlers box. In Event ID, enter the name of the print event handler. In Event Asset, enter the name of the file where that code resides.
When you're done, click Next until you get to the Finish page.
Cihaz meta veri paketini gözden geçir sayfasında, tüm ayarların doğru olduğundan emin olun ve Cihaz meta veri paketini yerel bilgisayardaki meta veri deposuna kopyala onay kutusunu seçin. Then click Save.
Windows'un cihaz bağlandığında güncelleştirilmiş cihaz meta verilerini okuması için yazıcınızı yeniden bağlayın.
Troubleshooting
Sorun: Gelişmiş yazdırma ayarları özel açılır pencere yerine varsayılan açılır pencereyi gösterir
Gelişmiş yazdırma ayarları açılır öğesi, uygulamanızın uyguladığı özel açılır öğe yerine varsayılan açılır öğeyi gösteriyorsa...
Possible cause: Test signing is not turned on. Onu nasıl açacağınız hakkında bilgi için bu konudaki Hata Ayıklama bölümüne bakın.
Possible cause: The app is not querying for the right Package Family Name. Kodunuzda Paket Aile Adını kontrol edin. Open up package.appxmanifest in Visual Studio and make sure that the package family name you are querying for matches the one in the Packaging tab, in the Package Family Name field.
Possible cause: The device metadata is not associated with the Package Family Name. Cihaz meta verilerini açmak ve paket ailesi adını denetlemek için Cihaz Meta Veri Yazma Sihirbazı'nı kullanın. Start the wizard from %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, by double-clicking DeviceMetadataWizard.exe.
Sorun: Uygulama açılır pencerede başlatılıyor ve hemen kapanıyor
Gelişmiş yazdırma ayarları için özel açılır öğeniz başlatıldıktan hemen sonra kaybolursa...
- Possible cause: In Windows 8, there is a known issue that within a flyout, UWP apps will be dismissed under the debugger. Etkinleştirmenin çalıştığını bildiğinizde hata ayıklamayı kapatın. Yazdırma biletini kaydetme sırasında hata ayıklamanız gerekiyorsa, aktifleştirmeden sonra hata ayıklayıcıyı ekleyin.