次の方法で共有


コントロール

Windows Presentation Foundation (WPF) には、ButtonLabelTextBoxMenuListBoxなど、ほぼすべての Windows アプリケーションで使用される一般的な UI コンポーネントの多くが付属しています。 これまで、これらのオブジェクトはコントロールと呼ばされてきました。 WPF SDK では引き続き "control" という用語を使用して、アプリケーション内の可視オブジェクトを表すクラスを疎に意味しますが、クラスが表示されるプレゼンスを持つには、Control クラスから継承する必要はないことを注意することが重要です。 Control クラスから継承するクラスには、ControlTemplateが含まれています。これにより、コントロールのコンシューマーは、新しいサブクラスを作成しなくても、コントロールの外観を根本的に変更できます。 このトピックでは、コントロール (Control クラスから継承されるコントロールと継承しないコントロールの両方) を WPF で一般的に使用する方法について説明します。

コントロールのインスタンスの作成

拡張アプリケーション マークアップ言語 (XAML) またはコードを使用して、アプリケーションにコントロールを追加できます。 次の例では、ユーザーに姓と名を求める単純なアプリケーションを作成する方法を示します。 この例では、XAML で 2 つのラベル、2 つのテキスト ボックス、2 つのボタンの 6 つのコントロールを作成します。 すべてのコントロールも同様に作成できます。

<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>

次の例では、コード内に同じアプリケーションを作成します。 簡潔にするために、Grid(grid1) の作成はサンプルから除外されています。 grid1 には、前の XAML の例で示したのと同じ列と行の定義があります。

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

コントロールの外観の変更

アプリケーションの外観に合わせてコントロールの外観を変更するのが一般的です。 コントロールの外観を変更するには、実行する内容に応じて、次のいずれかを実行します。

  • コントロールのプロパティの値を変更します。

  • コントロールに Style を作成します。

  • コントロールに新しい ControlTemplate を作成します。

コントロールのプロパティ値の変更

多くのコントロールには、ButtonBackground など、コントロールの表示方法を変更できるプロパティがあります。 値のプロパティは、XAML とコードの両方で設定できます。 次の例では、XAML の ButtonBackgroundFontSize、および FontWeight プロパティを設定します。

<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>

次の例では、コード内で同じプロパティを設定します。

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

コントロールのスタイルを作成する

WPF では、アプリケーション内の各インスタンスにプロパティを設定する代わりに、Styleを作成して、コントロールの外観を指定できます。 次の例では、アプリケーション内の各 Button に適用される Style を作成します。 Style 定義は、通常、FrameworkElementResources プロパティなど、ResourceDictionaryの XAML で定義されます。

<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>

また、スタイルにキーを割り当て、コントロールの Style プロパティでそのキーを指定することで、特定の種類の特定のコントロールにのみスタイルを適用することもできます。 スタイルの詳細については、「スタイルの とテンプレートの」を参照してください。

ControlTemplate の作成

Style を使用すると、一度に複数のコントロールにプロパティを設定できますが、Styleを作成して実行できる範囲を超えて、Control の外観をカスタマイズしたい場合があります。 Control クラスから継承するクラスには、Controlの構造と外観を定義する ControlTemplateがあります。 ControlTemplate プロパティはパブリックであるため、Control に既定とは異なる ControlTemplate を指定できます。 多くの場合、Controlの外観をカスタマイズするためにコントロールから継承するのではなく、Control の新しい ControlTemplate を指定できます。

非常によく使われるコントロール「Button」について検討してください。 Button の主な動作は、ユーザーがクリックしたときにアプリケーションが何らかのアクションを実行できるようにすることです。 既定では、WPF の Button は上げられた四角形として表示されます。 アプリケーションの開発中に、ボタンのクリックイベントを処理することで、Buttonの動作を利用することができますが、ボタンのプロパティを変更するだけでは実現できない範囲まで、ボタンの外観を変更することもあるでしょう。 この場合は、新しい ControlTemplateを作成できます。

次の例では、ButtonControlTemplate を作成します。 ControlTemplate は、角が丸くグラデーションの背景を持つ Button を作成します。 ControlTemplate には、Border が含まれており、その Background は2つの GradientStop オブジェクトを持つ LinearGradientBrush です。 最初の GradientStop では、データ バインディングを使用して、GradientStopColor プロパティをボタンの背景の色にバインドします。 ButtonBackground プロパティを設定すると、その値の色が最初の GradientStopとして使用されます。 データ バインディングの詳細については、「データ バインディングの概要」を参照してください。 この例では、IsPressedtrueされたときに Button の外観を変更する Trigger も作成します。

<!--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>

手記

ButtonBackground プロパティは、この例が正常に動作するために SolidColorBrush に設定されている必要があります。

イベントへの参加登録

XAML またはコードを使用してコントロールのイベントをサブスクライブできますが、処理できるのはコード内のイベントのみです。 次の例は、ButtonClick イベントをサブスクライブする方法を示しています。

<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

次の例では、ButtonClick イベントを処理します。

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

コントロールでのリッチ コンテンツ

Control クラスから継承するほとんどのクラスには、リッチ コンテンツを含む容量があります。 たとえば、Label には、文字列、ImagePanelなど、任意のオブジェクトを含めることができます。 次のクラスは、リッチ コンテンツのサポートを提供し、WPF のほとんどのコントロールの基底クラスとして機能します。

これらの基底クラスの詳細については、「WPF コンテンツ モデルの」を参照してください。

関連項目