Tetikleyiciler
.NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) tetikleyicileri, olaylara veya veri değişikliklerine göre denetimlerin görünümünü değiştiren eylemleri XAML'de bildirimli olarak ifade etmenizi sağlar. Ayrıca, özel bir tetikleyici grubu olan durum tetikleyicileri, ne VisualState zaman uygulanması gerektiğini tanımlar.
Bir tetikleyiciyi doğrudan denetimin koleksiyonuna atayabilir veya birden çok denetime Triggers uygulanacak sayfa düzeyinde veya uygulama düzeyinde bir kaynak sözlüğüne ekleyebilirsiniz.
Özellik tetikleyicileri
A Trigger , belirtilen özellik belirtilen bir koşulu karşıladığında özellik değerlerini uygulayan veya eylemler gerçekleştiren bir tetikleyiciyi temsil eder.
Aşağıdaki örnek, odağı aldığında arka plan rengini değiştiren bir TriggerEntry örneği gösterir:
<Entry Placeholder="Enter name">
<Entry.Triggers>
<Trigger TargetType="Entry"
Property="IsFocused"
Value="True">
<Setter Property="BackgroundColor"
Value="Yellow" />
<!-- Multiple Setter elements are allowed -->
</Trigger>
</Entry.Triggers>
</Entry>
Tetikleyicinin bildirimi aşağıdakileri belirtir:
- TargetType - tetikleyicinin uygulandığı denetim türü.
- Property - izlenen denetimdeki özelliği.
- Value - değeri, izlenen özellik için gerçekleştiğinde tetikleyicinin etkinleştirilmesine neden olur.
- Setter - tetikleyici koşulu karşılandığında uygulanan öğe koleksiyonu Setter .
Ayrıca isteğe bağlı EnterActions ve ExitActions koleksiyonlar belirtilebilir. Daha fazla bilgi için bkz . EnterActions ve ExitActions.
Stil kullanarak tetikleyici uygulama
Tetikleyiciler denetim, sayfa veya uygulama ResourceDictionaryüzerindeki bir bildirime Style de eklenebilir. Aşağıdaki örnek, sayfadaki tüm Entry denetimler için örtük bir stil bildirir:
<ContentPage.Resources>
<Style TargetType="Entry">
<Style.Triggers>
<Trigger TargetType="Entry"
Property="IsFocused"
Value="True">
<Setter Property="BackgroundColor"
Value="Yellow" />
<!-- Multiple Setter elements are allowed -->
</Trigger>
</Style.Triggers>
</Style>
</ContentPage.Resources>
Veri tetikleyicileri
, DataTrigger ilişkili veriler belirtilen bir koşula uyduğunda özellik değerlerini uygulayan veya eylemler gerçekleştiren bir tetikleyiciyi temsil eder. İşaretlemeyi Binding
uzantısı belirtilen koşulu izlemek için kullanılır.
Aşağıdaki örnekte, boş olduğunda a'nın Entry devre dışı bırakıldığını gösteren bir DataTriggerButton gösterilmektedir:
<Entry x:Name="entry"
Text=""
Placeholder="Enter text" />
<Button Text="Save">
<Button.Triggers>
<DataTrigger TargetType="Button"
Binding="{Binding Source={x:Reference entry},
Path=Text.Length}"
Value="0">
<Setter Property="IsEnabled"
Value="False" />
<!-- Multiple Setter elements are allowed -->
</DataTrigger>
</Button.Triggers>
</Button>
Bu örnekte, uzunluğu Entry sıfır olduğunda tetikleyici etkinleştirilir.
Bahşiş
Değerlendirme Path=Text.Length
sırasında her zaman hedef özellik (örn. Text=""
) için varsayılan bir değer sağlayın çünkü aksi takdirde null
olur ve tetikleyici beklediğiniz gibi çalışmaz.
Ayrıca isteğe bağlı EnterActions ve ExitActions koleksiyonlar belirtilebilir. Daha fazla bilgi için bkz . EnterActions ve ExitActions.
Olay tetikleyicileri
, EventTrigger bir olaya yanıt olarak bir dizi eylem uygulayan bir tetikleyiciyi temsil eder. EventTrigger'nin aksineTrigger, durumu sonlandırma kavramı yoktur, bu nedenle olayı tetikleyen koşul artık doğru olmadığında eylemler geri alınmaz.
yalnızca EventTrigger bir Event
özelliğin ayarlanmasını gerektirir:
<EventTrigger Event="TextChanged">
<local:NumericValidationTriggerAction />
</EventTrigger>
Bu örnekte hiçbir öğe yoktur Setter . Bunun yerine bir NumericalValidationTriggerAction
nesne vardır.
Dekont
Olay tetikleyicileri ve ExitActions'i desteklemezEnterActions.
Tetikleyici eylemi uygulaması şu şekilde olmalıdır:
- Tetikleyicinin TriggerAction<T> uygulanacağı denetim türüne karşılık gelen genel parametreyle genel sınıfı uygulayın. gibi VisualElement sınıfları kullanarak çeşitli denetimlerle çalışan tetikleyici eylemleri yazabilir veya gibi Entrybir denetim türü belirtebilirsiniz.
- Invoke yöntemini geçersiz kılın. Tetikleyici olayı her gerçekleştiğinde bu yöntem çağrılır.
- İsteğe bağlı olarak, tetikleyici bildirildiğinde XAML'de ayarlanabilen özellikleri kullanıma sunar.
Aşağıdaki örnekte sınıfı gösterilmektedir NumericValidationTriggerAction
:
public class NumericValidationTriggerAction : TriggerAction<Entry>
{
protected override void Invoke(Entry entry)
{
double result;
bool isValid = Double.TryParse(entry.Text, out result);
entry.TextColor = isValid ? Colors.Black : Colors.Red;
}
}
Uyarı
içinde ResourceDictionarytetikleyicileri paylaşırken dikkatli olun. Bir örnek denetimler arasında paylaşılır, böylece bir kez yapılandırılan tüm durumların tümüne uygulanır.
Çoklu tetikleyiciler
A MultiTrigger , bir dizi koşul karşılandığında özellik değerlerini uygulayan veya eylemler gerçekleştiren bir tetikleyiciyi temsil eder. Nesneler uygulanmadan önce Setter tüm koşullar doğru olmalıdır.
Aşağıdaki örnekte iki Entry nesneye bağlanan bir MultiTrigger gösterilmektedir:
<Entry x:Name="email"
Text="" />
<Entry x:Name="phone"
Text="" />
<Button Text="Save">
<Button.Triggers>
<MultiTrigger TargetType="Button">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding Source={x:Reference email},
Path=Text.Length}"
Value="0" />
<BindingCondition Binding="{Binding Source={x:Reference phone},
Path=Text.Length}"
Value="0" />
</MultiTrigger.Conditions>
<Setter Property="IsEnabled" Value="False" />
<!-- multiple Setter elements are allowed -->
</MultiTrigger>
</Button.Triggers>
</Button>
Buna ek olarak, MultiTrigger.Conditions
koleksiyon nesneleri de içerebilir PropertyCondition :
<PropertyCondition Property="Text"
Value="OK" />
EnterActions ve ExitActions
Tetikleyici gerçekleştiğinde değişiklikleri uygulamaya yönelik alternatif bir yaklaşım, ve koleksiyonları belirtmek EnterActions ve ExitActions uygulama oluşturmaktır TriggerAction<T> .
EnterActions türünde IList<TriggerAction>
koleksiyon, tetikleyici koşulu karşılandığında çağrılacak bir koleksiyon tanımlar. ExitActions türünde IList<TriggerAction>
koleksiyon, tetikleyici koşulu artık karşılanmadıktan sonra çağrılacak bir koleksiyon tanımlar.
Dekont
TriggerAction ve ExitActions koleksiyonlarında EnterActions tanımlanan nesneler sınıfı tarafından EventTrigger yoksayılır.
Aşağıdaki örnekte bir ve ExitAction
belirten EnterAction
bir özellik tetikleyicisi gösterilmektedir:
<Entry Placeholder="Enter job title">
<Entry.Triggers>
<Trigger TargetType="Entry"
Property="Entry.IsFocused"
Value="True">
<Trigger.EnterActions>
<local:FadeTriggerAction StartsFrom="0" />
</Trigger.EnterActions>
<Trigger.ExitActions>
<local:FadeTriggerAction StartsFrom="1" />
</Trigger.ExitActions>
</Trigger>
</Entry.Triggers>
</Entry>
Tetikleyici eylemi uygulaması şu şekilde olmalıdır:
- Tetikleyicinin TriggerAction<T> uygulanacağı denetim türüne karşılık gelen genel parametreyle genel sınıfı uygulayın. gibi VisualElement sınıfları kullanarak çeşitli denetimlerle çalışan tetikleyici eylemleri yazabilir veya gibi Entrybir denetim türü belirtebilirsiniz.
- Invoke yöntemini geçersiz kılın. Tetikleyici olayı her gerçekleştiğinde bu yöntem çağrılır.
- İsteğe bağlı olarak, tetikleyici bildirildiğinde XAML'de ayarlanabilen özellikleri kullanıma sunar.
Aşağıdaki örnekte sınıfı gösterilmektedir FadeTriggerAction
:
public class FadeTriggerAction : TriggerAction<VisualElement>
{
public int StartsFrom { get; set; }
protected override void Invoke(VisualElement sender)
{
sender.Animate("FadeTriggerAction", new Animation((d) =>
{
var val = StartsFrom == 1 ? d : 1 - d;
sender.BackgroundColor = Color.FromRgb(1, val, 1);
}),
length: 1000, // milliseconds
easing: Easing.Linear);
}
}
Dekont
EnterActions Tetikleyicideki nesneleri ve ExitActionsSetter sağlayabilirsiniz, ancak nesnelerin hemen çağrıldığını Setter unutmayın (veya ExitAction
işleminin EnterAction
tamamlanmasını beklemez).
Durum tetikleyicileri
Durum tetikleyicileri, uygulanması gereken koşulları tanımlayan özel bir VisualState tetikleyici grubudır.
Durum tetikleyicileri bir VisualStatekoleksiyonuna StateTriggers eklenir. Bu koleksiyon tek bir durum tetikleyicisi veya birden çok durum tetikleyicisi içerebilir. VisualState Bir, koleksiyondaki durum tetikleyicileri etkin olduğunda uygulanır.
Görsel durumları denetlemek için durum tetikleyicileri kullanılırken ,NET MAUI hangi tetikleyicinin (ve karşılık gelen VisualState) etkin olacağını belirlemek için aşağıdaki öncelik kurallarını kullanır:
- 'den StateTriggerBasetüretilen tüm tetikleyiciler.
- AdaptiveTrigger Koşul karşılandığından MinWindowWidth etkinleştirildi.
- AdaptiveTrigger Koşul karşılandığından MinWindowHeight etkinleştirildi.
Birden çok tetikleyici aynı anda etkinse (örneğin, iki özel tetikleyici), işaretlemede bildirilen ilk tetikleyici önceliklidir.
Dekont
Durum tetikleyicileri bir Styleiçinde veya doğrudan öğelerde ayarlanabilir.
Görsel durumlar hakkında daha fazla bilgi için bkz . Görsel durumlar.
Durum tetikleyicisi
StateTrigger sınıfından türetilen sınıfın StateTriggerBase bağlanabilir özelliği IsActive vardır. StateTrigger özelliği değeri değiştirdiğinde IsActive bir VisualState değişikliği tetikler.
StateTriggerBase Tüm durum tetikleyicileri için temel sınıf olan sınıfın bir IsActive özelliği ve olayı IsActiveChanged vardır. Bu olay, bir VisualState değişiklik olduğunda tetikler. Ayrıca, sınıfı geçersiz StateTriggerBase kılınabilir OnAttached ve OnDetached yöntemleri vardır.
Önemli
StateTrigger.IsActive
Bağlanabilir özellik devralınan StateTriggerBase.IsActive
özelliği gizler.
Aşağıdaki XAML örneğinde nesneleri içeren StateTrigger bir Style gösterilmektedir:
<Style TargetType="Grid">
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup>
<VisualState x:Name="Checked">
<VisualState.StateTriggers>
<StateTrigger IsActive="{Binding IsToggled}"
IsActiveChanged="OnCheckedStateIsActiveChanged" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="BackgroundColor"
Value="Black" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Unchecked">
<VisualState.StateTriggers>
<StateTrigger IsActive="{Binding IsToggled, Converter={StaticResource inverseBooleanConverter}}"
IsActiveChanged="OnUncheckedStateIsActiveChanged" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="BackgroundColor"
Value="White" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
Bu örnekte, örtük Style nesneleri hedefler Grid . IsToggled
İlişkili nesnenin özelliği olduğunda true
öğesinin arka plan rengi Grid siyah olarak ayarlanır. IsToggled
İlişkili nesnenin özelliği haline geldiğinde false
bir VisualState değişiklik tetiklenir ve arka plan rengi Grid beyaz olur.
Buna ek olarak, her VisualState değişiklik gerçekleştiğinde IsActiveChanged için VisualState olayı oluşturulur. Her VisualState bir olay, bu olay için bir olay işleyicisi kaydeder:
void OnCheckedStateIsActiveChanged(object sender, EventArgs e)
{
StateTriggerBase stateTrigger = sender as StateTriggerBase;
Console.WriteLine($"Checked state active: {stateTrigger.IsActive}");
}
void OnUncheckedStateIsActiveChanged(object sender, EventArgs e)
{
StateTriggerBase stateTrigger = sender as StateTriggerBase;
Console.WriteLine($"Unchecked state active: {stateTrigger.IsActive}");
}
Bu örnekte, olay için IsActiveChanged bir işleyici tetiklendiğinde, işleyici etkin olup olmadığını VisualState çıkışını alır. Örneğin, aşağıdaki iletiler görsel durumundan görsel durumuna değiştirilirken Checked
konsol penceresine Unchecked
gönderilir:
Checked state active: False
Unchecked state active: True
Dekont
Özel durum tetikleyicileri sınıfından StateTriggerBase türetilerek ve gerekli kayıtları ve temizleme işlemlerini gerçekleştirmek için ve OnDetached
yöntemlerini geçersiz kılarak OnAttached
oluşturulabilir.
Uyarlamalı tetikleyici
Pencere AdaptiveTrigger belirtilen yükseklik veya genişlikte olduğunda bir VisualState değişiklik tetikler. Bu tetikleyicinin iki bağlanabilir özelliği vardır:
- MinWindowHeight, türüne
double
göre, uygulanacağı en düşük pencere yüksekliğini VisualState gösterir. - MinWindowWidth, türüne
double
göre, uygulanacağı en düşük pencere genişliğini VisualState gösterir.
Dekont
sınıfından AdaptiveTriggerStateTriggerBase türetilir ve bu nedenle olaya bir olay işleyicisi IsActiveChanged
ekleyebilir.
Aşağıdaki XAML örneğinde nesneleri içeren AdaptiveTrigger bir Style gösterilmektedir:
<Style TargetType="StackLayout">
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup>
<VisualState x:Name="Vertical">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Orientation"
Value="Vertical" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Horizontal">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="800" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Orientation"
Value="Horizontal" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
Bu örnekte, örtük Style nesneleri hedefler StackLayout . Pencere genişliği 0 ile 800 cihazdan bağımsız birim arasında olduğunda, StackLayout uygulandığı nesnelerin Style dikey yönlendirmesi olur. Pencere genişliği >= 800 cihazdan VisualState bağımsız birim olduğunda, değişiklik tetikler ve StackLayout yönlendirme yatay olarak değişir.
MinWindowHeight ve MinWindowWidth özellikleri birbirinden bağımsız olarak veya birbiriyle birlikte kullanılabilir. Aşağıdaki XAML'de her iki özelliğin de ayarlanmasına ilişkin bir örnek gösterilmektedir:
<AdaptiveTrigger MinWindowWidth="800"
MinWindowHeight="1200"/>
Bu örnekte, AdaptiveTrigger geçerli pencere genişliği >= 800 cihazdan bağımsız birim ve geçerli pencere yüksekliği = 1200 cihazdan bağımsız birim olduğunda >ilgilinin VisualState uygulanacağını gösterir.
Durum tetikleyicisi karşılaştırması
özelliği CompareStateTrigger belirli bir VisualState değere eşit olduğunda bir değişikliği tetikler. Bu tetikleyicinin iki bağlanabilir özelliği vardır:
- Property, türündedir
object
ve tetikleyici tarafından karşılaştırılan özelliği gösterir. - Value, türündedir
object
. Bu, uygulanacağı değeri VisualState gösterir.
Dekont
sınıfından CompareStateTriggerStateTriggerBase türetilir ve bu nedenle olaya bir olay işleyicisi IsActiveChanged
ekleyebilir.
Aşağıdaki XAML örneğinde nesneleri içeren CompareStateTrigger bir Style gösterilmektedir:
<Style TargetType="Grid">
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup>
<VisualState x:Name="Checked">
<VisualState.StateTriggers>
<CompareStateTrigger Property="{Binding Source={x:Reference checkBox}, Path=IsChecked}"
Value="True" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="BackgroundColor"
Value="Black" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Unchecked">
<VisualState.StateTriggers>
<CompareStateTrigger Property="{Binding Source={x:Reference checkBox}, Path=IsChecked}"
Value="False" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="BackgroundColor"
Value="White" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
...
<Grid>
<Frame BackgroundColor="White"
CornerRadius="12"
Margin="24"
HorizontalOptions="Center"
VerticalOptions="Center">
<StackLayout Orientation="Horizontal">
<CheckBox x:Name="checkBox"
VerticalOptions="Center" />
<Label Text="Check the CheckBox to modify the Grid background color."
VerticalOptions="Center" />
</StackLayout>
</Frame>
</Grid>
Bu örnekte, örtük Style nesneleri hedefler Grid . IsChecked
özelliği CheckBox olduğundafalse
, öğesinin Grid arka plan rengi beyaz olarak ayarlanır. CheckBox.IsChecked
özelliği olduğunda true
bir VisualState değişiklik tetiklenir ve arka plan rengi Grid siyah olur.
Cihaz durumu tetikleyicisi
, DeviceStateTrigger uygulamanın üzerinde çalıştığı cihaz platformuna göre bir VisualState değişiklik tetikler. Bu tetikleyicinin tek bir bağlanabilir özelliği vardır:
- Device, türüne
string
göre, uygulanacağı cihaz platformunu VisualState gösterir.
Dekont
sınıfından DeviceStateTriggerStateTriggerBase türetilir ve bu nedenle olaya bir olay işleyicisi IsActiveChanged
ekleyebilir.
Aşağıdaki XAML örneğinde nesneleri içeren DeviceStateTrigger bir Style gösterilmektedir:
<Style x:Key="DeviceStateTriggerPageStyle"
TargetType="ContentPage">
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup>
<VisualState x:Name="iOS">
<VisualState.StateTriggers>
<DeviceStateTrigger Device="iOS" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="BackgroundColor"
Value="Silver" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Android">
<VisualState.StateTriggers>
<DeviceStateTrigger Device="Android" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="BackgroundColor"
Value="#2196F3" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
Bu örnekte, açık Style nesneleri hedefler ContentPage . ContentPage stil kullanan nesneler, arka plan renklerini iOS'ta gümüş ve Android'de soluk mavi olarak ayarlar.
Yönlendirme durumu tetikleyicisi
cihazın OrientationStateTrigger yönü değiştiğinde bir VisualState değişiklik tetikler. Bu tetikleyicinin tek bir bağlanabilir özelliği vardır:
- Orientation, türüne DisplayOrientationgöre, hangi yönlendirmenin VisualState uygulanacağını gösterir.
Dekont
sınıfından OrientationStateTrigger
StateTriggerBase türetilir ve bu nedenle olaya bir olay işleyicisi IsActiveChanged
ekleyebilir.
Aşağıdaki XAML örneğinde nesneleri içeren OrientationStateTrigger bir Style gösterilmektedir:
<Style x:Key="OrientationStateTriggerPageStyle"
TargetType="ContentPage">
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup>
<VisualState x:Name="Portrait">
<VisualState.StateTriggers>
<OrientationStateTrigger Orientation="Portrait" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="BackgroundColor"
Value="Silver" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Landscape">
<VisualState.StateTriggers>
<OrientationStateTrigger Orientation="Landscape" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="BackgroundColor"
Value="White" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
Bu örnekte, açık Style nesneleri hedefler ContentPage . ContentPage stili kullanan nesneler, yönlendirme dikey olduğunda arka plan renklerini gümüş olarak, yönlendirme yatay olduğunda ise arka plan renklerini beyaz olarak ayarlar.