XAML'den C#'a

July 15, 2026 · View on GitHub

FmgLib.MauiMarkup, XAML'de atayabildiğiniz her özellik için bir fluent genişletme metodu sağlar. Bir avuç eşleme kuralını içselleştirdikten sonra herhangi bir XAML parçasını mekanik olarak çevirebilirsiniz.

Eşleme Kuralları

XAML kavramıFmgLib.MauiMarkup karşılığı
<Label ... /> öğesinew Label()
Öznitelik Text="Hi".Text("Hi")
Attached property Grid.Row="1".Row(1) (bkz. Attached Property'ler)
Property element <Label.Content>…Nesneyi alan aynı fluent metot: .Content(new … )
Çocuk koleksiyonu (örtük içerik)Konteynere göre .Children(...), .Items(...), .Content(...)
{Binding Path=Name}.Text(e => e.Path("Name")) (bkz. Özellik Bağlama)
{StaticResource key}Doğrudan C# nesnesini/sabitini kullanın
{DynamicResource key}.BackgroundColor(e => e.DynamicResource("key"))
{OnPlatform ...}.FontSize(e => e.OnAndroid(20).OniOS(24).Default(22))
{OnIdiom ...}.FontSize(e => e.OnPhone(20).OnDesktop(40).Default(30))
{AppThemeBinding Light=…, Dark=…}.TextColor(e => e.OnLight(Colors.Black).OnDark(Colors.White))
x:Name="myLabel".Assign(out var myLabel)
Olay özniteliği Clicked="OnClicked".OnClicked(OnClicked)
<Style TargetType="Button">new Style<Button>(e => e …) (bkz. Stiller)
<DataTemplate>.ItemTemplate(() => new …) — görünümü üreten bir lambda

Yan Yana Örnekler

Basit kontrol

XAML

<Image
    Source="dotnet_bot.png"
    HeightRequest="100"
    WidthRequest="150"
    Grid.Row="0"
    Grid.Column="1"
    Grid.RowSpan="2"
    Opacity=".8" />

C#

new Image()
.Source("dotnet_bot.png")
.Row(0)
.Column(1)
.RowSpan(2)
.SizeRequest(150, 100)   // kolaylık: WidthRequest + HeightRequest'i tek seferde ayarlar
.Opacity(.8)

SizeRequest(width, height), kütüphanenin 1:1 özellik eşlemesinin ötesinde eklediği kolaylık kısayollarından biridir. Elbette .WidthRequest(150).HeightRequest(100) da yazabilirsiniz.

Metin biçimlendirme

XAML

<Label Text="fmglib.mauimarkup"
       FontSize="12"
       Grid.Row="1"
       TextColor="Green"
       FontAttributes="Bold"
       Margin="5,3,0,5" />

C#

new Label()
.Text("fmglib.mauimarkup")
.FontSize(12)
.Row(1)
.TextColor(Colors.Green)
.FontAttributes(FontAttributes.Bold)
.Margin(new Thickness(5, 3, 0, 5))

Margin ve Padding daha pratik overload'lara da sahiptir:

.Margin(10)                    // tüm kenarlar
.Margin(10, 5)                 // yatay, dikey
.Margin(5, 3, 0, 5)            // sol, üst, sağ, alt
.Margin(left: 5, bottom: 5)    // isimli — belirtilmeyen kenarlar 0 olur

İç içe içerikli bir sayfa

XAML

<ContentPage BackgroundImageSource="background.jpg">
    <StackLayout HorizontalOptions="Center" VerticalOptions="Center">
        <ActivityIndicator IsRunning="True"
                           HeightRequest="70"
                           WidthRequest="70" />
    </StackLayout>
</ContentPage>

C# (sayfa sınıfının içinde)

this
.BackgroundImageSource("background.jpg")
.Content(
    new StackLayout()
    .Center()
    .Children(
        new ActivityIndicator()
        .IsRunning(true)
        .HeightRequest(70)
        .WidthRequest(70)
        .Center()
    )
);

Binding'ler

XAML

<Label Text="{Binding Value, Source={x:Reference slider}, StringFormat='Slider: {0}'}" />

C#

new Slider().Assign(out var slider).Minimum(1).Maximum(20),

new Label()
.Text(e => e.Path("Value").Source(slider).StringFormat("Slider: {0}"))

DataTemplate'ler

XAML

<CollectionView ItemsSource="{Binding Products}">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Label Text="{Binding Name}" FontSize="20" />
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

C#

new CollectionView()
.ItemsSource(e => e.Path("Products"))
.ItemTemplate(() =>
    new Label()
    .Text(e => e.Path("Name"))
    .FontSize(20)
)

ItemTemplate'e verilen lambda <DataTemplate> öğesinin rolünü üstlenir: gerçekleşen her öğe için bir kez çağrılır ve içindeki binding'ler öğenin BindingContext'ine göre çözülür.

Kaynaklar ve stiller

XAML

<ContentPage.Resources>
    <Style TargetType="Entry">
        <Setter Property="TextColor" Value="White" />
    </Style>
</ContentPage.Resources>

C#

this.Resources(
    new ResourceDictionary
    {
        new Style<Entry>(e => e.TextColor(Colors.White))
    }
)

XAML'e Göre Kazanımlar

  • Tek dil — mantık ve UI bir arada; code-behind/x:Name tesisatı yok.

  • Derleme zamanı güvenliği — özellik adındaki yazım hatası çalışma zamanı çökmesi değil, derleme hatasıdır.

  • Tam IntelliSense ve refactoring — view model özelliğini yeniden adlandırın, derlenmiş binding'lerle yazılmış tüm "binding"ler otomatik takip eder.

  • Gerçek kontrol akışı — UI kurarken if, döngü, LINQ, local function ve yardımcı metotlar kullanın:

    new VerticalStackLayout()
    .Children(
        menuItems.Select(item =>
            (IView)new Button().Text(item.Title).OnClicked(_ => Navigate(item))
        ).ToArray()
    )
    
  • Kompozisyon — herhangi bir alt ağacı sıradan bir metoda çıkarın:

    static Border Card(string title, View content) =>
        new Border()
        .StrokeShape(new RoundRectangle().CornerRadius(12))
        .Padding(16)
        .Content(
            new VerticalStackLayout().Spacing(8).Children(
                new Label().Text(title).FontAttributes(FontAttributes.Bold),
                content
            )
        );
    

İlgili Konular