Windows 10 Geliştirme - Uyarlanabilir Kod

Bu bölümde, uygulamanızın Windows 10 tarafından desteklenen farklı cihazlara nasıl uyarlandığını göstereceğiz. Kullanıcı Arayüzünüzü ve UWP uygulamalarında kullanılan tüm hileleri, teknikleri ve kontrolleri benimsemeyi zaten öğrendik.

Şimdi, kodunuzu benimsemeyi öğreneceğiz çünkü

  • Uygulama kodları tüm cihazlarda aynı değildir.

  • Özellikle Xbox için kullanılan API'ler mobil cihazlarda kullanılamayacaktır. Aynı şey HoloLens vb. İçin de geçerlidir.

Adaptive kod, uygulamanızı koşullu olarak aydınlatabilir ve kodu yalnızca belirli bir cihaz ailesinde ve / veya platform / uzantı API'lerinin belirli bir sürümünde çalışırken çalıştırabilir.

Kod Yazma

Windows 10'da, C ++, C #, Visual Basic veya JavaScript kullanarak UWP uygulamalarını Visual Studio'da uygulayabilirsiniz.

  • C # ve Visual Basic ile, UI tasarımı için XAML kullanabilirsiniz.

  • C ++ ile XAML kullanmak yerine DirectX'i kullanabilirsiniz.

  • JavaScript için, çapraz platform Web standartları olan sunum katmanınız için HTML kullanabilirsiniz.

Windows Core API'leri, kodunuz ve kullanıcı arayüzünüz için ihtiyaç duyduğunuz işlevlerin çoğunu içeren tüm cihazlar için aynı şekilde çalışır. Bununla birlikte, belirli cihaz aileleri için uyarlanmış kod ve kullanıcı arabirimi için, uyarlanabilir kodu ve uyarlanabilir kullanıcı arabirimini kullanmanız gerekir.

Calling an API that is NOT implemented by the target device family −

Kullanıcı arayüzü farklı ekranlara kolayca uyum sağlar, ancak farklı cihaz aileleri yalnızca farklı ekran boyutlarına sahip olmakla kalmaz, bundan çok daha fazlasına sahiptir.

  • Örneğin, cep telefonlarında Geri ve Kamera gibi bazı donanım düğmeleri bulunur ve bunlar PC gibi diğer cihazlarda bulunmayabilir.

  • Varsayılan olarak, temel API'ler, tüm cihazlar için çalışan işlevselliğin çoğunu içerir, ancak cihaza özgü işlevsellik, tıpkı harici montajlar gibi UWP uygulamalarınızdaki Uzantı SDK'larına referans verilerek kullanılabilir.

Uygulamanızda ihtiyaç duyulan belirli bir uzantı SDK'sını eklemek için aşağıda verilen adımları izleyin -

  • Sağ tıklayın References.

  • Seçiniz “Add References..”. Aşağıdaki iletişim kutusu açılacaktır.

  • Bir uzantı eklemek, bir proje referansı eklemek kadar basittir.

  • Artık listeden, Masaüstü Uzantısı, IoT Uzantısı ve Mobil Uzantı vb. İçeren herhangi bir uzantı SDK'sını ekleyebilirsiniz.

Masaüstü ve Mobil uzantılar, en yaygın iki platform Uzantı SDK'sıdır. Örneğin Mobil uzantı, donanım kamera düğmesini kullanmak için gerekli API'leri etkinleştirir.

Cihaz özelliklerini kontrol etmek için Windows.Foundation.Metadata.ApiInformationmevcut cihazda tür destekleniyorsa bir Boole çıkışı döndüren sınıf yöntemi. Örneğin, Windows uygulamanızın Kamera düğmesini bunun gibi bir kodla kullanmasını sağlayabilirsiniz -

bool isHardwareButtonsAPIPresent = 
   Windows.Foundation.Metadata.ApiInformation.
   IsTypePresent("Windows.Phone.UI.Inpu t.HardwareButtons");  
		
if (isHardwareButtonsAPIPresent) { 
   Windows.Phone.UI.Input.HardwareButtons.CameraPressed += HardwareButtons_CameraPressed; 
}

Telefon kamera düğmesi kodu, yalnızca cihazda Mobil Uzantı SDK'sı etkinleştirilmişse yürütülür. Benzer şekilde, mevcut API sürümündeki belirli bir olay, yöntem veya özelliği kullanarak da kontrol edebilirsiniz.IsEventPresent, IsMethodPresent, IsPropertyPresent, onun yerine IsTypePresent Aşağıda gösterildiği gibi.

bool isHardwareButtons_CameraPressedAPIPresent = 
   Windows.Foundation.Metadata.ApiInformation.IsEventPresent 
   ("Windows.Phone.UI.Input.HardwareButtons", "CameraPressed");

UWP'deki Win32 API'leri

C ++ / CX ile yazılmış bir Universal Widows Platform (UWP) uygulaması veya Windows Runtime Component, artık UWP'nin bir parçası olan Win32 API'lerine erişebilir. Windows 10 cihaz ailelerinin tümü, uygulamanızı birbirine bağlayarak Win32 API'lerini uygulayabilir.Windowsapp.lib.

Windowsapp.libUWP API'leri için dışa aktarım sağlayan bir "şemsiye" kitaplıktır. BağlanıyorWindowsapp.lib uygulamanızın bağımlılıklarına eklenecek dlls tüm Windows 10 cihaz ailelerinde bulunan.

Uygulamanın hem masaüstünü hem de telefonu hedeflediği basit bir örneğe bakalım. Bu nedenle, uygulama masaüstünde çalıştığında durum çubuğunu göstermeyecek, ancak aynı uygulama telefonda çalıştığında durum çubuğunu gösterecektir.

Aşağıda, farklı kontrollerin eklendiği XAML kodu verilmiştir.

<Page 
   x:Class = "UWPAdoptiveCode.MainPage" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:local = "using:UWPAdoptiveCode" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   mc:Ignorable = "d">  

   <Page.Background> 
      <SolidColorBrush Color = "Green"/> 
   </Page.Background>
	
   <Page.BottomAppBar> 
      <CommandBar x:Name = "commandBar" > 
         <AppBarButton Icon = "Accept" Label = "appbarbutton"/> 
         <AppBarButton Icon = "Cancel" Label = "appbarbutton"/> 
      </CommandBar> 
   </Page.BottomAppBar>
	
   <Grid Background = "AliceBlue"> 
	
      <VisualStateManager.VisualStateGroups> 
		
         <VisualStateGroup> 
			
            <VisualState> 
               <VisualState.StateTriggers> 
                  <local:DeviceFamilyTrigger DeviceFamily = "Desktop" /> 
               </VisualState.StateTriggers> 
					
               <VisualState.Setters> 
                  <Setter Target = "StatusBarControls.Visibility" 
                     Value = "Collapsed"/> 
               </VisualState.Setters>  
					
            </VisualState> 
				
         </VisualStateGroup> 
			
      </VisualStateManager.VisualStateGroups> 
		
      <StackPanel HorizontalAlignment = "Left" Margin = "75,164,0,0"
         VerticalAlignment = "Top" > 
			
         <RadioButton x:Name = "ShowAppBarRadioButton" Content = "Show AppBar"
            HorizontalAlignment = "Stretch" VerticalAlignment = "Stretch"
            IsChecked = "True" Checked = "RadioButton_Checked"/>
				
         <RadioButton x:Name = "ShowOpaqueAppBarRadioButton" 
            Content = "Show Transparent AppBar" HorizontalAlignment = "Stretch"
            VerticalAlignment = "Stretch" Checked = "RadioButton_Checked"/> 
				
         <RadioButton x:Name = "HideAppBarRadioButton" Content = "Hide AppBar"
            HorizontalAlignment = "Stretch" VerticalAlignment = "Stretch" 
            Checked = "RadioButton_Checked"/>
				
      </StackPanel> 
		
      <StackPanel x:Name = "StatusBarControls" Orientation = "Vertical" 
         Margin = "75,350,0,0" Visibility = "Visible">
			
         <CheckBox x:Name = "StatusBarBackgroundCheckBox" 
            Content = "Set StatusBar Background"
            Checked = "StatusBarBackgroundCheckBox_Checked" 
            Unchecked = "StatusBarBackgroundCheckBox_Unchecked"/>
				
         <CheckBox x:Name = "StatusBarHiddenCheckBox" 
            Content = "Set StatusBar Hidden" Checked = "StatusBarHiddenCheckBox_Checked"
            Unchecked = "StatusBarHiddenCheckBox_Unchecked"/> 
				
      </StackPanel> 
		
   </Grid> 
	
</Page>

Aşağıda, farklı olaylar için C # uygulaması verilmiştir.

using Windows.UI; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls;  

// The Blank Page item template is documented at
   http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409  

namespace UWPAdoptiveCode { 
   /// <summary> 
      /// An empty page that can be used on its own or navigated to within a Frame. 
   /// </summary> 
	
   public sealed partial class MainPage : Page { 
     
      private Color? DefaultTitleBarButtonsBGColor; 
      private Color? DefaultTitleBarBGColor;
		
      public MainPage() {
         this.InitializeComponent();
			
         //Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().
            VisibleBoundsCh anged += MainPage_VisibleBoundsChanged;
				
         var viewTitleBar = Windows.UI.ViewManagement.ApplicationView.
            GetForCurrentView().TitleBar; 
				
         DefaultTitleBarBGColor = viewTitleBar.BackgroundColor; 
         DefaultTitleBarButtonsBGColor = viewTitleBar.ButtonBackgroundColor; 
      } 
		
      private void RadioButton_Checked(object sender, RoutedEventArgs e) {
        
         // Bottom AppBar shows on Desktop and Mobile 
         if (ShowAppBarRadioButton != null) {
			  
            if (ShowAppBarRadioButton.IsChecked.HasValue &&
               (ShowAppBarRadioButton.IsChecked.Value == true)) {
                 commandBar.Visibility = Windows.UI.Xaml.Visibility.Visible; 
                 commandBar.Opacity = 1; 
            } else {
               commandBar.Visibility = Windows.UI.Xaml.Visibility.Collapsed; 
            } 
         } 
			
         if (ShowOpaqueAppBarRadioButton != null) {
             
            if (ShowOpaqueAppBarRadioButton.IsChecked.HasValue &&
               (ShowOpaqueAppBarRadioButton.IsChecked.Value == true)){ 
                  commandBar.Visibility = Windows.UI.Xaml.Visibility.Visible; 
                  commandBar.Background.Opacity = 0; 
            } else{ 
               commandBar.Background.Opacity = 1; 
            } 
         } 
			
      } 
		
      private void StatusBarHiddenCheckBox_Checked(object sender, RoutedEventArgs e){
        
         // StatusBar is Mobile only 
         if (Windows.Foundation.Metadata.ApiInformation.
            IsTypePresent("Windows.UI.ViewManag ement.StatusBar")){ 
               var ignore = Windows.UI.ViewManagement.StatusBar.GetForCurrentView().HideAsync(); 
         } 
      } 
		
      private void StatusBarHiddenCheckBox_Unchecked(object sender, RoutedEventArgs e){
	  
         // StatusBar is Mobile only 
         if (Windows.Foundation.Metadata.ApiInformation.
            IsTypePresent("Windows.UI.ViewManag ement.StatusBar")){
               var ignore = Windows.UI.ViewManagement.StatusBar.GetForCurrentView().ShowAsync(); 
         } 
      }  
		
      private void StatusBarBackgroundCheckBox_Checked(object sender, RoutedEventArgs e){
       
         // StatusBar is Mobile only 
         if (Windows.Foundation.Metadata.ApiInformation.
            IsTypePresent("Windows.UI.ViewManag ement.StatusBar")){ 
				
               Windows.UI.ViewManagement.StatusBar.GetForCurrentView().
                  BackgroundColor = Windows.UI.Colors.Blue; 
					
               Windows.UI.ViewManagement.StatusBar.GetForCurrentView().
                   BackgroundOpacity = 1; 
         } 
      }  
		
      private void StatusBarBackgroundCheckBox_Unchecked(object sender, RoutedEventArgs e){
         
         // StatusBar is Mobile only 
         if (Windows.Foundation.Metadata.ApiInformation.
            IsTypePresent("Windows.UI.ViewManag ement.StatusBar")){
               Windows.UI.ViewManagement.StatusBar.GetForCurrentView().
                  BackgroundOpacity = 0; 
         } 
      } 
		
   } 
	
   public class DeviceFamilyTrigger : StateTriggerBase{
    
      //private variables 
      private string _deviceFamily;
	  
      //Public property 
      public string DeviceFamily {
         
         get {
            return _deviceFamily; 
         } 
         set{
            _deviceFamily = value; 
            var qualifiers = Windows.ApplicationModel.Resources.Core.ResourceContext.
               GetForCurrentView().Qua lifierValues; 
					
            if (qualifiers.ContainsKey("DeviceFamily")) 
               SetActive(qualifiers["DeviceFamily"] == _deviceFamily); 
            else 
               SetActive(false); 
         } 
      } 
   } 
}

Yukarıdaki kod derlendiğinde ve bir Mobil cihazda çalıştırıldığında, aşağıdaki pencereyi göreceksiniz.

Durum çubuğunun arka plan rengini görüntüde gösterildiği gibi onay kutusu ile değiştirebilirsiniz.

Durum çubuğunu da gizleyebilirsiniz.

Şimdi, aynı uygulamayı bir masaüstü cihazda çalıştırdığınızda, durum çubuğunun ve durum çubuğuna özgü onay kutularının görünmediği aşağıdaki pencereyi göreceksiniz.