Denetimler

Windows Presentation Foundation (WPF), , , , ve gibi neredeyse tüm Windows kullanıcı arabirimi bileşenleriyle ButtonLabel birlikte TextBox birlikte MenuListBox kullanılır. Geçmişte bu nesnelere denetimler dendi. WPF SDK'sı uygulamada görünür bir nesneyi temsil eden herhangi bir sınıfı gevşek bir şekilde ifade etmek için "denetim" terimini kullanmaya devam ederken, bir sınıfın görünür bir varlığına sahip olmak için sınıftan devralması gerek olmadığını Control unutmayın. sınıfından devralınan sınıflar, bir denetimin tüketicisi yeni bir alt sınıf oluşturmak zorunda kalmadan denetimin görünümünü kökten değiştirmesini sağlayan ControlControlTemplate bir içerir. Bu konuda, denetimlerin (hem sınıftan devralan hem de almayanlar) Control WPF'de yaygın olarak nasıl kullanıldıkları ele alıstır.

Denetim Örneği Oluşturma

Uygulamanıza bir denetim eklemek için Extensible Application Markup Language (XAML) veya kod ebilirsiniz. Aşağıdaki örnek, kullanıcıdan adını ve soyadını isteyen basit bir uygulamanın nasıl oluşturulup oluşturulamayyrı gösterir. Bu örnek altı denetim oluşturur: XAML'de iki etiket, iki metin kutusu ve iki düğme. Tüm denetimler benzer şekilde oluşturulabilir.

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="30"/>
    <RowDefinition Height="30"/>
    <RowDefinition Height="30"/>
    <RowDefinition/>
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition/>
    <ColumnDefinition/>
  </Grid.ColumnDefinitions>

  <Label>
    Enter your first name:
  </Label>
  <TextBox Grid.Row="0" Grid.Column="1" 
           Name="firstName" Margin="0,5,10,5"/>

  <Label Grid.Row="1" >
    Enter your last name:
  </Label>
  <TextBox Grid.Row="1" Grid.Column="1" 
           Name="lastName" Margin="0,5,10,5"/>

  <Button Grid.Row="2" Grid.Column="0" 
          Name="submit" Margin="2">
    View message
  </Button>

  <Button Grid.Row="2" Grid.Column="1" 
          Name="Clear" Margin="2">
    Clear Name
  </Button>
</Grid>

Aşağıdaki örnek, kodda aynı uygulamayı oluşturur. Daha fazla açıklama için , Grid oluşturma grid1 işlemi örnekten dışlandı. grid1 , önceki XAML örneğinde gösterildiği gibi aynı sütun ve satır tanımlarını içerir.

Label firstNameLabel;
Label lastNameLabel;
TextBox firstName;
TextBox lastName;
Button submit;
Button clear;

void CreateControls()
{
    firstNameLabel = new Label();
    firstNameLabel.Content = "Enter your first name:";
    grid1.Children.Add(firstNameLabel);

    firstName = new TextBox();
    firstName.Margin = new Thickness(0, 5, 10, 5);
    Grid.SetColumn(firstName, 1);
    grid1.Children.Add(firstName);

    lastNameLabel = new Label();
    lastNameLabel.Content = "Enter your last name:";
    Grid.SetRow(lastNameLabel, 1);
    grid1.Children.Add(lastNameLabel);

    lastName = new TextBox();
    lastName.Margin = new Thickness(0, 5, 10, 5);
    Grid.SetColumn(lastName, 1);
    Grid.SetRow(lastName, 1);
    grid1.Children.Add(lastName);

    submit = new Button();
    submit.Content = "View message";
    Grid.SetRow(submit, 2);
    grid1.Children.Add(submit);

    clear = new Button();
    clear.Content = "Clear Name";
    Grid.SetRow(clear, 2);
    Grid.SetColumn(clear, 1);
    grid1.Children.Add(clear);
}
Private firstNameLabel As Label
Private lastNameLabel As Label
Private firstName As TextBox
Private lastName As TextBox
Private submit As Button
Private clear As Button

Sub CreateControls()
    firstNameLabel = New Label()
    firstNameLabel.Content = "Enter your first name:"
    grid1.Children.Add(firstNameLabel)

    firstName = New TextBox()
    firstName.Margin = New Thickness(0, 5, 10, 5)
    Grid.SetColumn(firstName, 1)
    grid1.Children.Add(firstName)

    lastNameLabel = New Label()
    lastNameLabel.Content = "Enter your last name:"
    Grid.SetRow(lastNameLabel, 1)
    grid1.Children.Add(lastNameLabel)

    lastName = New TextBox()
    lastName.Margin = New Thickness(0, 5, 10, 5)
    Grid.SetColumn(lastName, 1)
    Grid.SetRow(lastName, 1)
    grid1.Children.Add(lastName)

    submit = New Button()
    submit.Content = "View message"
    Grid.SetRow(submit, 2)
    grid1.Children.Add(submit)

    clear = New Button()
    clear.Content = "Clear Name"
    Grid.SetRow(clear, 2)
    Grid.SetColumn(clear, 1)
    grid1.Children.Add(clear)


End Sub

Denetimin Görünümünü Değiştirme

Bir denetimin görünümünü, uygulamanın genel görünümüne uyacak şekilde değiştirmek yaygın bir durum olabilir. Ne yapmak istediğinize bağlı olarak, aşağıdakilerden birini yaparak denetimin görünümünü değiştirebilirsiniz:

  • Denetimin bir özelliğinin değerini değiştirme.

  • Denetim için Style bir oluşturun.

  • Denetim için ControlTemplate yeni bir oluşturun.

Denetimin Özellik Değerini Değiştirme

Birçok denetimin, denetimin nasıl göründüğüne (örneğin, bir ) değiştirmenizi sağlayan Background özellikleri Button vardır. Değer özelliklerini hem XAML'de hem de kodda ayarlayabilirsiniz. Aşağıdaki örnek, BackgroundFontSizeFontWeight XAML'de bir üzerinde , Button ve özelliklerini ayarlar.

<Button FontSize="14" FontWeight="Bold">
  <!--Set the Background property of the Button to
    a LinearGradientBrush.-->
  <Button.Background>
    <LinearGradientBrush StartPoint="0,0.5" 
                            EndPoint="1,0.5">
      <GradientStop Color="Green" Offset="0.0" />
      <GradientStop Color="White" Offset="0.9" />
    </LinearGradientBrush>

  </Button.Background>
  View message
</Button>

Aşağıdaki örnek, kodda aynı özellikleri ayarlar.

LinearGradientBrush buttonBrush = new LinearGradientBrush();
buttonBrush.StartPoint = new Point(0, 0.5);
buttonBrush.EndPoint = new Point(1, 0.5);
buttonBrush.GradientStops.Add(new GradientStop(Colors.Green, 0));
buttonBrush.GradientStops.Add(new GradientStop(Colors.White, 0.9));

submit.Background = buttonBrush;
submit.FontSize = 14;
submit.FontWeight = FontWeights.Bold;
Dim buttonBrush As New LinearGradientBrush()
buttonBrush.StartPoint = New Point(0, 0.5)
buttonBrush.EndPoint = New Point(1, 0.5)
buttonBrush.GradientStops.Add(New GradientStop(Colors.Green, 0))
buttonBrush.GradientStops.Add(New GradientStop(Colors.White, 0.9))

submit.Background = buttonBrush
submit.FontSize = 14
submit.FontWeight = FontWeights.Bold

Denetim için Stil Oluşturma

WPF, bir oluşturarak uygulamanın her örneğinde özellikleri ayarlama yerine denetimlerin görünümünü toplu olarak belirtmenizi Style sağlar. Aşağıdaki örnek, Style uygulamanın her biri için uygulanan Button bir oluşturur. Style tanımları genellikle bir içinde XAML içinde ResourceDictionary tanımlanır, Resources örneğin, FrameworkElement özelliği.

<Style TargetType="Button">
  <Setter Property="FontSize" Value="14"/>
  <Setter Property="FontWeight" Value="Bold"/>
  <Setter Property="Background">
    <Setter.Value>
      <LinearGradientBrush StartPoint="0,0.5" 
                              EndPoint="1,0.5">
        <GradientStop Color="Green" Offset="0.0" />
        <GradientStop Color="White" Offset="0.9" />
      </LinearGradientBrush>

    </Setter.Value>
  </Setter>
</Style>

Ayrıca stile bir anahtar atayıp denetiminizin özelliğinde bu anahtarı belirterek yalnızca belirli bir türün belirli Style denetimlerine stil uygulayabilirsiniz. Stiller hakkında daha fazla bilgi için bkz. Stil oluşturma ve oluşturma.

ControlTemplate Oluşturma

, aynı anda birden çok denetimde özellik ayarlamanızı sağlar, ancak bazen bir oluşturarak bir görünümünü, neler yapanın ötesinde StyleControl özelleştirmek istiyor Style olabilir. sınıfından Control devralınan sınıfların yapısını ControlTemplate ve görünümünü tanımlayan bir Control vardır. özelliğinin genel olduğu için varsayılan değerden farklı bir değeri TemplateControlControlControlTemplate veserini veabilirsiniz. Bir görünümünü özelleştirmek için ControlTemplate genellikle bir Control denetimden devralma yerine için yeni bir Control belirtebilirsiniz.

Çok yaygın olan denetimi göz önünde Button bulundurarak. uygulamasının birincil Button davranışı, bir uygulamanın kullanıcı tıkladığında bazı eylemlerde ekleyebilirsiniz. Varsayılan olarak, Button WPF'de yükseltilmiş dikdörtgen olarak görünür. Bir uygulama geliştirirken, düğmenin tıklama olaylarını işerek bir davranışının avantajını elde etmek istiyor, ancak düğmenin özelliklerini değiştirerek düğmenin görünümünü, neler yapalarının ötesinde Button değiştirebilirsiniz. Bu durumda, yeni bir ControlTemplate oluşturabilirsiniz.

Aşağıdaki örnek için ControlTemplate bir Button oluşturur. , ControlTemplate yuvarlanmış Button köşeler ve gradyan arka plan ile bir oluşturur. ControlTemplate, iki nesnesi olan bir BorderBackgroundLinearGradientBrushGradientStop içerir. GradientStopİlki, özelliğini düğmenin Color arka GradientStop planının rengine bağlamak için veri bağlamayı kullanır. özelliğini ayar Background her Button ayarda, bu değerin rengi ilk olarak GradientStop kullanılır. Veri bağlama hakkında daha fazla bilgi için bkz. Veri Bağlamaya Genel Bakış. Örnek ayrıca olduğunda Trigger görünümünü değiştirir bir ButtonIsPressedtrue oluşturur.

<!--Define a template that creates a gradient-colored button.-->
<Style TargetType="Button">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <Border 
          x:Name="Border"  
          CornerRadius="20" 
          BorderThickness="1"
          BorderBrush="Black">
          <Border.Background>
            <LinearGradientBrush StartPoint="0,0.5" 
                                 EndPoint="1,0.5">
              <GradientStop Color="{Binding Background.Color, 
                    RelativeSource={RelativeSource TemplatedParent}}" 
                            Offset="0.0" />
              <GradientStop Color="White" Offset="0.9" />
            </LinearGradientBrush>
          </Border.Background>
          <ContentPresenter 
            Margin="2"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            RecognizesAccessKey="True"/>
        </Border>
        <ControlTemplate.Triggers>
          <!--Change the appearance of
          the button when the user clicks it.-->
          <Trigger Property="IsPressed" Value="true">
            <Setter TargetName="Border" Property="Background">
              <Setter.Value>
                <LinearGradientBrush StartPoint="0,0.5" 
                                     EndPoint="1,0.5">
                  <GradientStop Color="{Binding Background.Color, 
                    RelativeSource={RelativeSource TemplatedParent}}" 
                                Offset="0.0" />
                  <GradientStop Color="DarkSlateGray" Offset="0.9" />
                </LinearGradientBrush>
              </Setter.Value>
            </Setter>
          </Trigger>

        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>
<Button Grid.Row="2" Grid.ColumnSpan="2" Name="submitName"
        Background="Green">View message</Button>

Not

BackgroundÖrneğin düzgün Button çalışması için özelliğinin SolidColorBrush bir olarak ayarlanmış olması gerekir.

Olaylara Abone Olmak

XAML veya kod kullanarak bir denetimin olayına abone olabilirsiniz, ancak bir olayı yalnızca kodda işebilirsiniz. Aşağıdaki örnekte, bir olayına nasıl abone Click olun olduğu Button gösterir.

<Button Grid.Row="2" Grid.ColumnSpan="2" Name="submitName" Click="submit_Click"
  Background="Green">View message</Button>
submit.Click += new RoutedEventHandler(submit_Click);
AddHandler submit.Click, AddressOf submit_Click

Aşağıdaki örnek bir olayı Click ele Button almaktadır.

void submit_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Hello, " + firstName.Text + " " + lastName.Text);
}
Private Sub submit_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    MessageBox.Show("Hello, " + firstName.Text + " " + lastName.Text)

End Sub

Denetimlerde Zengin İçerik

sınıfından devralınan Control sınıfların çoğu zengin içerik içerme kapasitesine sahiptir. Örneğin, bir Label dize, veya gibi herhangi bir Image nesne Panel içerebilir. Aşağıdaki sınıflar zengin içerik için destek sağlar ve WPF'de denetimlerin çoğu için temel sınıflar olarak hareket eder.

Bu temel sınıflar hakkında daha fazla bilgi için bkz. WPF İçerik Modeli.

Ayrıca bkz.