Dinamik düzenler

XAML düzen sistemi, esnek bir kullanıcı arabirimi oluşturmanıza yardımcı olmak için öğelerin, düzen panellerinin ve görsel durumların otomatik olarak boyutlandırılması sağlar. Duyarlı bir düzen sayesinde uygulamanızın farklı uygulama penceresi boyutları, çözünürlükleri, piksel yoğunlukları ve yönlendirmeleri olan ekranlarda harika görünmesini sağlayabilirsiniz. Duyarlı tasarım tekniklerinde açıklandığı gibi XAML kullanarak uygulamanızın kullanıcı arabirimini yeniden konumlandırabilir, yeniden boyutlandırabilir, yeniden akıtabilir, gösterebilir/gizleyebilir, değiştirebilir veya yeniden tasarlayabilirsiniz. Burada, XAML ile duyarlı düzenleri nasıl uygulayacağımızı ele aacağız.

Özelliklere ve panellere sahip akışkan düzenleri

Duyarlı düzenin temeli, içeriği akıcı bir şekilde yeniden konumlandırmak, yeniden boyutlandırmak ve yeniden akıtmak için XAML düzen özelliklerinin ve panellerinin uygun şekilde kullanılmasıdır.

XAML düzen sistemi hem statik hem de akıcı düzenleri destekler. Statik düzende denetimlere açık piksel boyutları ve konumları verirsiniz. Kullanıcı cihazının çözünürlüğünü veya yönlendirmesini değiştirdiğinde kullanıcı arabirimi değişmez. Statik düzenler farklı form faktörleri ve görüntü boyutları arasında kırpılabilir. Öte yandan, akışkan düzenler bir cihazda bulunan görsel alana yanıt vermek için küçülür, büyür ve yeniden düzenlenir.

Uygulamada, kullanıcı arabiriminizi oluşturmak için statik ve akıcı öğelerin bir bileşimini kullanırsınız. Bazı yerlerde statik öğeler ve değerler kullanmaya devam edebilirsiniz, ancak genel kullanıcı arabiriminin farklı çözünürlüklere, ekran boyutlarına ve görünümlere duyarlı olduğundan emin olun.

Burada, akıcı bir düzen oluşturmak için XAML özelliklerini ve düzen panellerini kullanmayı ele aacağız.

Düzen özellikleri

Düzen özellikleri bir öğenin boyutunu ve konumunu denetler. Akıcı bir düzen oluşturmak için, öğeler için otomatik veya orantılı boyutlandırmayı kullanın ve düzen panellerinin çocuklarını gerektiği gibi konumlandırmasına izin verin.

Burada bazı yaygın düzen özellikleri ve bunların akışkan düzenleri oluşturmak için nasıl kullanılacağı anlatılır.

Yükseklik ve Genişlik

Height ve Width özellikleri bir öğenin boyutunu belirtir. Etkin piksel cinsinden ölçülen sabit değerleri veya otomatik veya orantılı boyutlandırmayı kullanabilirsiniz.

Otomatik boyutlandırma, kullanıcı arabirimi öğelerini içeriğine veya üst kapsayıcısına sığacak şekilde yeniden boyutlandırır. Otomatik boyutlandırmayı bir kılavuzun satırları ve sütunlarıyla da kullanabilirsiniz. Otomatik boyutlandırmayı kullanmak için, Kullanıcı arabirimi öğelerinin Yükseklik ve/veya Genişliği'ni Otomatik olarak ayarlayın.

Uyarı

Bir öğenin boyutunun içeriğine veya kapsayıcısına göre değişip değişmemesi, üst kapsayıcının alt öğelerin boyutunu nasıl işlediğine bağlıdır. Daha fazla bilgi için bu makalede daha sonra yer alan Düzen panellerine bakın.

Yıldız boyutlandırma olarak da adlandırılan orantılı boyutlandırma, kullanılabilir alanı bir kılavuzun satır ve sütunları arasında ağırlıklı oranlara göre dağıtır. XAML'de yıldız değerleri* (veya ağırlıklı yıldız boyutlandırması için n* olarak ifade edilir). Örneğin, bir sütunun 2 sütunlu düzendeki ikinci sütundan 5 kat daha geniş olduğunu belirtmek için ColumnDefinition öğelerindeki Width özellikleri için "5*" ve "*" kullanın.

Bu örnek, 4 sütunlu bir Grid içinde sabit, otomatik ve orantılı boyutlandırmayı birleştirir.

Köşe yazısı Boyutlandırma Description
Sütun_1 Otomatik Sütun, içeriğine sığacak şekilde boyutlandırılır.
Sütun_2 * Otomatik sütunlar hesaplandıktan sonra sütun kalan genişliğin bir kısmını alır. Column_2, Column_4'ün yarısı kadar genişlikte olacaktır.
Sütun_3 44 Sütun 44 piksel genişliğinde olacaktır.
Sütun_4 2* Otomatik sütunlar hesaplandıktan sonra sütun kalan genişliğin bir kısmını alır. Column_4, Column_2'den iki kat daha geniş olacaktır.

Varsayılan sütun genişliği "*" olduğundan, ikinci sütun için bu değeri açıkça ayarlamanız gerekmez.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition/>
        <ColumnDefinition Width="44"/>
        <ColumnDefinition Width="2*"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="Column 1 sizes to its content." FontSize="24"/>
</Grid>

Çalışma zamanında bir öğenin boyutunu almak için Height ve Width yerine salt okunur ActualHeight ve ActualWidth özelliklerini kullanın.

Boyut kısıtlamaları

Kullanıcı arabiriminizde otomatik boyutlandırmayı kullandığınızda, yine de bir öğenin boyutuna kısıtlamalar yerleştirmeniz gerekebilir. MinWidth/ ve MinHeight/MaxHeight özelliklerini, sıvının yeniden boyutlandırılmasına izin verirken bir öğenin boyutunu kısıtlayan değerleri belirtmek için ayarlayabilirsiniz.

Kılavuzda, MinWidth/MaxWidth sütun tanımlarıyla da kullanılabilir ve MinHeight/MaxHeight satır tanımlarıyla kullanılabilir.

Hizalama

Bir öğenin üst kapsayıcısı içinde nasıl konumlandırılacağını belirtmek için HorizontalAlignment ve VerticalAlignment özelliklerini kullanın.

  • HorizontalAlignment değerleri Sol, Orta, Sağ ve Esnetme'tir.
  • VerticalAlignment değerleri Top, Center, Bottom ve Stretch değerleridir.

Esnetme hizalamasıyla, öğeler üst kapsayıcıda sağladıkları tüm alanı doldurur. Esnetme, her iki hizalama özelliği için de varsayılan değerdir. Ancak Düğme gibi bazı denetimler bu değeri varsayılan stillerinde geçersiz kılar. Alt öğeleri olabilecek herhangi bir öğe, HorizontalAlignment ve VerticalAlignment özelliklerinin Stretch değerini benzersiz bir şekilde ele alabilir. Örneğin, varsayılan Esnetme değerlerini kullanan bir öğe Izgara'ya yerleştirildiğinde, onu içeren hücreyi dolduracak şekilde esnetilir. Tuvale yerleştirilen aynı öğe, içeriğine göre boyutlanır. Her panelin Esnetme değerini nasıl işlediği hakkında daha fazla bilgi için Düzen panelleri makalesine bakın.

Daha fazla bilgi için Hizalama, kenar boşluğu ve doldurma makalesine ve HorizontalAlignment ve VerticalAlignment başvuru sayfalarına bakın.

Görünürlük

Görünürlük özelliğini Görünürlük sabit listesi değerlerinden birine ayarlayarak bir öğeyi açabilir veya gizleyebilirsiniz: Görünür veya Daraltılmış. Bir öğe Daraltılmış olduğunda, kullanıcı arabirimi düzeninde yer kaplamaz.

Bir öğenin Görünürlük özelliğini kodda veya görsel durumda değiştirebilirsiniz. Öğenin Görünürlüğü değiştirildiğinde, tüm alt öğeleri de değiştirilir. Bir paneli daraltırken diğerini açığa çıkararak kullanıcı arayüzünüzün bölümlerini değiştirebilirsiniz.

Tavsiye

Kullanıcı arabiriminizde varsayılan olarak Daraltılmış öğeler varsa, nesneler görünür olmasa bile başlangıçta oluşturulmaya devam eder. Bu öğelerin yüklenmesini, nesnelerin oluşturulmasını geciktirmek için x:Load özniteliği kullanılarak gösterilene kadar erteleyebilirsiniz. Bu, başlangıç performansını geliştirebilir. Daha fazla bilgi için bkz. x:Load özniteliği.

Stil kaynakları

Her özellik değerini bir denetimde ayrı ayrı ayarlamanız gerekmez. Özellik değerlerini bir Stil kaynağında gruplandırmak ve bir denetime Stil uygulamak genellikle daha verimlidir. Bu, özellikle aynı özellik değerlerini birçok denetime uygulamanız gerektiğinde geçerlidir. Stilleri kullanma hakkında daha fazla bilgi için bkz. Stil oluşturma denetimleri.

Düzen panelleri

Görsel nesneleri konumlandırmak için bunları bir panele veya başka bir kapsayıcı nesnesine yerleştirmeniz gerekir. XAML çerçevesi, kapsayıcı olarak hizmet veren ve kullanıcı arabirimi öğelerini yerleştirmenize ve yerleştirmenize olanak tanıyan Canvas, Grid, RelativePanel ve StackPanel gibi çeşitli panel sınıfları sağlar.

Düzen paneli seçerken dikkate alınması gereken temel şey, panelin alt öğelerini nasıl konumlandırıp boyutlandırtığıdır. Çakışan alt öğelerin üst üste nasıl katmanlandığına da dikkat etmeniz gerekebilir.

XAML çerçevesinde sağlanan panel denetimlerinin ana özelliklerinin karşılaştırması aşağıda verilmiştir.

Kontrol Paneli Description
Çadır Tuval akıcı kullanıcı arabirimini desteklemez; alt öğeleri konumlandırmanın ve boyutlandırmanın tüm yönlerini siz denetlersiniz. Genellikle grafik oluşturma gibi özel durumlarda veya daha büyük uyarlamalı bir kullanıcı arabiriminin küçük statik alanlarını tanımlamak için kullanırsınız. Çalışma zamanında öğeleri yeniden konumlandırmak için kod veya görsel durumları kullanabilirsiniz.
  • Öğeler kesinlikle Canvas.Top ve Canvas.Left ekli özellikleri kullanılarak konumlandırılır.
  • Katmanlama, Canvas.ZIndex ekli özelliği kullanılarak açıkça belirtilebilir.
  • HorizontalAlignment/VerticalAlignment için esnetme değerleri dikkate alınmaz. Bir öğenin boyutu açıkça ayarlanmazsa, içeriğine göre boyutlandırılır.
  • Çocuk içerik panelden büyükse görünür şekilde kırpılmaz.
  • Alt içerik panelin sınırları tarafından kısıtlanmaz.
  • Kılavuz Kılavuz alt öğelerin akıcı yeniden boyutlandırmasını destekler. Öğeleri yeniden konumlandırmak ve yeniden akıtmak için kod veya görsel durumları kullanabilirsiniz.
  • Öğeler Grid.Row ve Grid.Column ekli özellikleri kullanılarak satırlar ve sütunlar halinde düzenlenir.
  • Öğeler Grid.RowSpan ve Grid.ColumnSpan ekli özelliklerini kullanarak birden çok satıra ve sütuna yayılabilir.
  • HorizontalAlignment/VerticalAlignment için esnetme değerlerine uyulur. Bir öğenin boyutu açıkça ayarlanmazsa, kılavuz hücresindeki mevcut alanı dolduracak şekilde yayılır.
  • Alt içerik panelden büyükse görsel olarak kırpılır.
  • İçerik boyutu panelin sınırları tarafından kısıtlandığından, kaydırılabilir içerik gerekirse kaydırma çubuklarını gösterir.
  • RelativePanel
  • Elemanlar panelin kenarına veya ortasına göre ve birbirine göre düzenlenir.
  • Öğeler; paneldeki hizalama, benzer öğelerin hizalanması ve konumlandırılması gibi işlevleri kontrol eden çeşitli ekli özellikler kullanılarak konumlandırılır.
  • HorizontalAlignment/VerticalAlignment için esnetme değerleri, hizalama amacıyla RelativePanel'in ekli özellikleri esnetmeye neden olmadıkça uygulanmaz (örneğin, bir öğe panelin hem sağ hem de sol kenarlarına hizalanmışsa). Bir öğenin boyutu açıkça ayarlanmamışsa ve genişletilmemişse, içeriğine göre boyutlandırılır.
  • Alt içerik panelden büyükse görsel olarak kırpılır.
  • İçerik boyutu panelin sınırları tarafından kısıtlandığından, kaydırılabilir içerik gerekirse kaydırma çubuklarını gösterir.
  • StackPanel
  • Öğeler dikey veya yatay olarak tek bir satırda yığılır.
  • HorizontalAlignment/VerticalAlignment için esnetme değerleri, Orientation özelliğinin karşısındaki yönde kabul edilir. Bir öğenin boyutu açıkça ayarlanmazsa, kullanılabilir genişliği (Yön yatay ise, yüksekliği) kaplayacak şekilde esner. Orientation özelliği tarafından belirtilen yönde, bir öğe içeriğine göre boyutlandırılır.
  • Alt içerik panelden büyükse görsel olarak kırpılır.
  • İçerik boyutu panelin sınırları tarafından Yönlendirme özelliği tarafından belirtilen yönde kısıtlanmaz, bu nedenle kaydırılabilir içerik panel sınırlarının ötesine uzanır ve kaydırma çubuklarını göstermez. Alt içeriğin yüksekliğini ya da genişliğini açıkça sınırlamanız gerekir ki kaydırma çubukları gösterilsin.
  • VariableSizedWrapGrid
  • Öğeler, MaximumRowsOrColumns değerine ulaşıldığında otomatik olarak yeni bir satıra veya sütuna kaydırılan satırlar veya sütunlar halinde düzenlenir.
  • Öğelerin satırlar veya sütunlar halinde düzenlenip düzenlenmeyeceği Yönlendirme özelliği tarafından belirtilir.
  • Öğeler VariableSizedWrapGrid.RowSpan ve VariableSizedWrapGrid.ColumnSpan ekli özelliklerini kullanarak birden çok satıra ve sütuna yayılabilir.
  • HorizontalAlignment ve VerticalAlignment için esnetme değerleri yoksayılır. Öğeler ItemHeight ve ItemWidth özellikleri tarafından belirtilen şekilde boyutlandırılır. Bu özellikler ayarlanmazsa, değerlerini ilk hücrenin boyutundan alır.
  • Alt içerik panelden büyükse görsel olarak kırpılır.
  • İçerik boyutu panelin sınırları tarafından kısıtlandığından, kaydırılabilir içerik gerekirse kaydırma çubuklarını gösterir.
  • Ayrıntılı bilgi ve bu panellerin örneklerini görmek için Düzen panelleri bölümüne bakın.

    Düzen panelleri, kullanıcı arabiriminizi mantıksal denetim grupları halinde düzenlemenize olanak sağlar. Bunları uygun özellik ayarlarıyla kullandığınızda, kullanıcı arabirimi öğelerini otomatik olarak yeniden boyutlandırma, yeniden konumlandırma ve yeniden akıtma desteği alırsınız. Ancak çoğu kullanıcı arabirimi düzeninde, pencere boyutunda önemli değişiklikler olduğunda daha fazla değişiklik yapılması gerekir. Bunun için görsel durumları kullanabilirsiniz.

    Görsel durumları ve durum tetikleyicileri ile uyarlamalı düzenler

    Pencere boyutuna veya diğer değişikliklere göre kullanıcı arabiriminizde önemli değişiklikler yapmak için görsel durumları kullanın.

    Uygulama pencereniz belirli bir miktarın üzerinde büyür veya küçülürse, kullanıcı arabiriminizin bölümlerini yeniden konumlandırmak, yeniden boyutlandırmak, yeniden akıtmak, ortaya çıkarmak veya değiştirmek için düzen özelliklerini değiştirmek isteyebilirsiniz. Kullanıcı arabiriminiz için farklı görsel durumlar tanımlayabilir ve pencere genişliği veya pencere yüksekliği belirtilen eşiği aştığında bunları uygulayabilirsiniz.

    VisualState, belirli bir durumdayken bir öğeye uygulanan özellik değerlerini tanımlar. VisualStateManager'da, belirtilen koşullar karşılandığında uygun VisualState'i uygulayan görsel durumları gruplandırırsınız. AdaptiveTrigger, XAML'de bir durumun uygulandığı eşiği ('kesme noktası' olarak da adlandırılır) ayarlamak için kolay bir yol sağlar. Alternatif olarak, görsel durumunu uygulamak için kodunuzda VisualStateManager.GoToState yöntemini çağırabilirsiniz. Her iki yönteme de örnekler sonraki bölümlerde gösterilmiştir.

    Kodda görsel durumları ayarlama

    Koddan görsel durum uygulamak için VisualStateManager.GoToState yöntemini çağırırsınız. Örneğin, uygulama penceresi belirli bir boyutta olduğunda bir durum uygulamak için SizeChanged olayını işleyin ve uygun durumu uygulamak için GoToState'i çağırın.

    Burada, visualstategroup iki VisualState tanımı içerir. İlki, DefaultStateboş. Uygulandığında, XAML sayfasında tanımlanan değerler uygulanır. İkincisi, WideStateSplitView'unDisplayMode özelliğini Satır İçinde olarak değiştirir ve bölmeyi açar. Bu durum, pencere genişliği 640 etkin pikselden büyükse SizeChanged olay işleyicisinde uygulanır.

    Uyarı

    Windows, uygulamanızın üzerinde çalıştığı cihazı algılaması için bir yol sağlamaz. Etkili çözünürlüğü ve uygulama için kullanılabilir ekran alanı miktarını (uygulama penceresinin boyutu) size söyleyebilir. Ekran boyutları ve kesme noktaları için görsel durumlar tanımlamanızı öneririz.

    <Page ...
        SizeChanged="Page_SizeChanged">
        <Grid>
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup>
                    <VisualState x:Name="DefaultState">
                            <Storyboard>
                            </Storyboard>
                        </VisualState>
    
                    <VisualState x:Name="WideState">
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames
                                Storyboard.TargetProperty="SplitView.DisplayMode"
                                Storyboard.TargetName="mySplitView">
                                <DiscreteObjectKeyFrame KeyTime="0">
                                    <DiscreteObjectKeyFrame.Value>
                                        <SplitViewDisplayMode>Inline</SplitViewDisplayMode>
                                    </DiscreteObjectKeyFrame.Value>
                                </DiscreteObjectKeyFrame>
                            </ObjectAnimationUsingKeyFrames>
                            <ObjectAnimationUsingKeyFrames
                                Storyboard.TargetProperty="SplitView.IsPaneOpen"
                                Storyboard.TargetName="mySplitView">
                                <DiscreteObjectKeyFrame KeyTime="0" Value="True"/>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
    
            <SplitView x:Name="mySplitView" DisplayMode="CompactInline"
                       IsPaneOpen="False" CompactPaneLength="20">
                <!-- SplitView content -->
    
                <SplitView.Pane>
                    <!-- Pane content -->
                </SplitView.Pane>
            </SplitView>
        </Grid>
    </Page>
    
    private void Page_SizeChanged(object sender, Microsoft.UI.Xaml.SizeChangedEventArgs e)
    {
        if (e.Size.Width > 640)
            VisualStateManager.GoToState(this, "WideState", false);
        else
            VisualStateManager.GoToState(this, "DefaultState", false);
    }
    
    // YourPage.h
    void Page_SizeChanged(winrt::Windows::Foundation::IInspectable const& sender, winrt::Microsoft::UI::Xaml::SizeChangedEventArgs const& e);
    
    // YourPage.cpp
    void YourPage::Page_SizeChanged(IInspectable const& sender, SizeChangedEventArgs const& e)
    {
        if (e.NewSize.Width > 640)
            VisualStateManager::GoToState(*this, "WideState", false);
        else
            VisualStateManager::GoToState(*this, "DefaultState", false);
    }
    
    

    XAML işaretlemesinde görsel durumları ayarlama

    Windows 10 önce VisualState tanımları, özellik değişiklikleri için Storyboard nesnelerini gerektiriyordu ve durumu uygulamak için kodda GoToState çağrısı yapmak zorunda kaldınız. Bu, önceki örnekte gösterilmiştir. Yine de bu söz dizimini kullanan birçok örnek görürsünüz veya bu söz dizimini kullanan bir kodunuz olabilir.

    Windows 10'dan itibaren, burada gösterilen basitleştirilmiş Setter söz dizimini kullanabilir ve durumu uygulamak için XAML işaretlemenizde bir StateTrigger kullanabilirsiniz. Bir uygulama olayına yanıt olarak görsel durum değişikliklerini otomatik olarak tetikleyen basit kurallar oluşturmak için durum tetikleyicilerini kullanırsınız.

    Bu örnek, önceki örnekle aynı şeyi yapar, ancak özellik değişikliklerini tanımlamak için Görsel Taslak yerine basitleştirilmiş Ayarlayıcı söz dizimini kullanır. GoToState'i çağırmak yerine, durumu uygulamak için yerleşik AdaptiveTrigger durum tetikleyicisini kullanır. Durum tetikleyicilerini kullandığınızda boş DefaultStatebir tanımlamanız gerekmez. Durum tetikleyicisinin koşulları artık karşılanmadığında varsayılan ayarlar otomatik olarak yeniden uygulanır.

    <Page ...>
        <Grid>
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup>
                    <VisualState>
                        <VisualState.StateTriggers>
                            <!-- VisualState to be triggered when the
                                 window width is >=640 effective pixels. -->
                            <AdaptiveTrigger MinWindowWidth="640" />
                        </VisualState.StateTriggers>
    
                        <VisualState.Setters>
                            <Setter Target="mySplitView.DisplayMode" Value="Inline"/>
                            <Setter Target="mySplitView.IsPaneOpen" Value="True"/>
                        </VisualState.Setters>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
    
            <SplitView x:Name="mySplitView" DisplayMode="CompactInline"
                       IsPaneOpen="False" CompactPaneLength="20">
                <!-- SplitView content -->
    
                <SplitView.Pane>
                    <!-- Pane content -->
                </SplitView.Pane>
            </SplitView>
        </Grid>
    </Page>
    

    Önemli

    Önceki örnekte VisualStateManager.VisualStateGroups ekli özelliği Grid öğesinde ayarlanmıştır. StateTriggers kullandığınızda, tetikleyicilerin otomatik olarak etkili olması için VisualStateGroups'un her zaman kökün ilk alt öğesine bağlı olduğundan emin olun. (Burada, Grid, kök Sayfa öğesinin ilk çocuk öğesidir.)

    İliştirilmiş özellik söz dizimi

    VisualState'te genellikle bir denetim özelliği için veya denetimi içeren panelin ekli özelliklerinden biri için bir değer ayarlarsınız. Ekli bir özellik ayarladığınızda, ekli özellik adının çevresinde parantezler kullanın.

    Bu örnekte, adlı bir TextBox üzerinde ekli özelliğinin nasıl ayarlanacağı gösterilmektedir. İlk XAML ObjectAnimationUsingKeyFrames söz dizimini, ikincisi ise Ayarlayıcı söz dizimini kullanır.

    <!-- Set an attached property using ObjectAnimationUsingKeyFrames. -->
    <ObjectAnimationUsingKeyFrames
        Storyboard.TargetProperty="(RelativePanel.AlignHorizontalCenterWithPanel)"
        Storyboard.TargetName="myTextBox">
        <DiscreteObjectKeyFrame KeyTime="0" Value="True"/>
    </ObjectAnimationUsingKeyFrames>
    
    <!-- Set an attached property using Setter. -->
    <Setter Target="myTextBox.(RelativePanel.AlignHorizontalCenterWithPanel)" Value="True"/>
    

    Özel durum tetikleyicileri

    StateTrigger sınıfını genişleterek çok çeşitli senaryolar için özel tetikleyiciler oluşturabilirsiniz. Örneğin, giriş türüne göre farklı durumları tetikleyen bir StateTrigger oluşturabilir, ardından giriş türüne dokunduğunda denetimin etrafındaki kenar boşluklarını artırabilirsiniz. Alternatif olarak, uygulamanın çalıştırdığı cihaz ailesine göre farklı durumlar uygulamak için bir StateTrigger oluşturun. Özel tetikleyiciler oluşturma ve bunları kullanarak tek bir XAML görünümünden en iyi duruma getirilmiş ui deneyimleri oluşturma örnekleri için bkz. State tetikleyicileri örneği.

    Görsel durumlar ve stiller

    Birden çok denetime bir dizi özellik değişikliği uygulamak için görsel durumlarındaki Stil kaynaklarını kullanabilirsiniz. Stilleri kullanma hakkında daha fazla bilgi için bkz. Stil oluşturma denetimleri.

    Durum tetikleyicileri örneğinden alınan bu basitleştirilmiş XAML'de, fare veya dokunmatik giriş için bir Düğme'nin boyutunu ve kenar boşluklarını ayarlamak amacıyla bir Stil kaynağı uygulanır. Kodun tamamı ve özel durum tetikleyicisinin tanımı için bkz. State tetikleyicileri örneği.

    <Page ... >
        <Page.Resources>
            <!-- Styles to be used for mouse vs. touch/pen hit targets -->
            <Style x:Key="MouseStyle" TargetType="Rectangle">
                <Setter Property="Margin" Value="5" />
                <Setter Property="Height" Value="20" />
                <Setter Property="Width" Value="20" />
            </Style>
            <Style x:Key="TouchPenStyle" TargetType="Rectangle">
                <Setter Property="Margin" Value="15" />
                <Setter Property="Height" Value="40" />
                <Setter Property="Width" Value="40" />
            </Style>
        </Page.Resources>
    
        <RelativePanel>
            <!-- ... -->
            <Button Content="Color Palette Button" x:Name="MenuButton">
                <Button.Flyout>
                    <Flyout Placement="Bottom">
                        <RelativePanel>
                            <Rectangle Name="BlueRect" Fill="Blue"/>
                            <Rectangle Name="GreenRect" Fill="Green" RelativePanel.RightOf="BlueRect" />
                            <!-- ... -->
                        </RelativePanel>
                    </Flyout>
                </Button.Flyout>
            </Button>
            <!-- ... -->
        </RelativePanel>
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="InputTypeStates">
                <!-- Second set of VisualStates for building responsive UI optimized for input type.
                     Take a look at InputTypeTrigger.cs class in CustomTriggers folder to see how this is implemented. -->
                <VisualState>
                    <VisualState.StateTriggers>
                        <!-- This trigger indicates that this VisualState is to be applied when MenuButton is invoked using a mouse. -->
                        <triggers:InputTypeTrigger TargetElement="{x:Bind MenuButton}" PointerType="Mouse" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="BlueRect.Style" Value="{StaticResource MouseStyle}" />
                        <Setter Target="GreenRect.Style" Value="{StaticResource MouseStyle}" />
                        <!-- ... -->
                    </VisualState.Setters>
                </VisualState>
                <VisualState>
                    <VisualState.StateTriggers>
                        <!-- Multiple trigger statements can be declared in the following way to imply OR usage.
                             For example, the following statements indicate that this VisualState is to be applied when MenuButton is invoked using Touch OR Pen.-->
                        <triggers:InputTypeTrigger TargetElement="{x:Bind MenuButton}" PointerType="Touch" />
                        <triggers:InputTypeTrigger TargetElement="{x:Bind MenuButton}" PointerType="Pen" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="BlueRect.Style" Value="{StaticResource TouchPenStyle}" />
                        <Setter Target="GreenRect.Style" Value="{StaticResource TouchPenStyle}" />
                        <!-- ... -->
                    </VisualState.Setters>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
    </Page>