次の方法で共有


チュートリアル : インライン値エディタの実装

更新 : 2007 年 11 月

Windows Presentation Foundation (WPF) Designer for Visual Studio の機能拡張モデルを使用すると、[プロパティ] ウィンドウ内のプロパティを操作するためのカスタムの値エディタをデザイン時に作成できます。作成できるのは、インライン エディタまたは外部エディタです。インライン エディタは、[プロパティ] ウィンドウで値を直接編集できるエディタです。外部エディタは、[プロパティ] ウィンドウの外部でプロパティを編集する UI を備えたエディタです。インライン エディタを作成する方法を示すために、このチュートリアルでは、コントロールの Background プロパティを操作するためのインライン値エディタを作成する手順を説明します。

このチュートリアルでは次のタスクを行います。

  • WPF カスタム コントロール プロジェクトを作成する。

  • [プロパティ] ウィンドウでプロパティ値の編集に使用できるインライン エディタを作成する。

  • カスタム エディタを提供するクラスにインライン エディタを接続するために使用する PropertyValueEditor 派生クラスを作成する。

  • 新しいインライン エディタを登録するために IRegisterMetadata 派生クラスを作成する。

  • デザイン時にインライン エディタをテストする。

前提条件

このチュートリアルを完了するには、次のコンポーネントが必要です。

  • Visual Studio 2008。

カスタム コントロールの作成

最初に、カスタム コントロールのプロジェクトを作成します。コントロールは、デザイン時コードが少量のシンプルなボタンにします。このボタンは、GetIsInDesignMode メソッドを使用して、デザイン時動作を実装します。

カスタム コントロールを作成するには

  1. Visual C# で CustomControlLibrary という名前の新しい WPF カスタム コントロール ライブラリ プロジェクトを作成します。

    コード エディタで CustomControl1 のコードが開きます。

  2. 次の WPF デザイナ アセンブリへの参照を追加します。

    • Microsoft.Windows.Design
  3. CustomControl1 のコード エディタで、CustomControlLibrary 名前空間のコードを次のコードに置き換えます。

    public class CustomControl1 : Button
    {
        public CustomControl1()
        {
            if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
            {
                Background = Brushes.Red;
            }
        }
    }
    
  4. プロジェクトの出力パスを "bin\" に設定します。

  5. ソリューションをビルドします。

インライン エディタのテンプレートの作成

インライン エディタは、XAML データ テンプレートを使用して作成できます。これは、Background プロパティの色選択リストを表示する簡単なドロップダウン リストになります。

インライン エディタのテンプレートを作成するには

  1. Visual C# で CustomControlLibrary.Design という名前の新しい WPF カスタム コントロール ライブラリ プロジェクトをソリューションに追加します。

    コード エディタで CustomControl1 のコードが開きます。

  2. ソリューション エクスプローラで、CustomControl1 ファイルを CustomControlLibrary.Design プロジェクトから削除します。

  3. 次の WPF デザイナ アセンブリへの参照を追加します。

    • Microsoft.Windows.Design
  4. CustomControlLibrary プロジェクトへの参照を追加します。

  5. プロジェクトの出力パスを "..\CustomControlLibrary\bin\" に設定します。これにより、コントロールのアセンブリとメタデータのアセンブリが同じフォルダ内に配置されるため、デザイナがメタデータを検出できます。

  6. EditorResources という名前の新しいクラスを CustomControlLibrary.Design プロジェクトに追加します。

  7. EditorResources のコード エディタで、自動的に生成されたコードを次のコードに置き換えます。

    namespace InlineEditorNamespace
    {
        using System;
        using System.Collections.Generic;
        using System.Text;
        using System.Windows;
        public partial class EditorResources : ResourceDictionary {
            public EditorResources()
                : base()
            {
                InitializeComponent();
            }
        }
    }
    
  8. [プロジェクト] メニューの [リソース ディクショナリの追加] をクリックします。

  9. フォームに EditorResources.xaml という名前を付け、[追加] をクリックします。

  10. EditorResources の XAML ビューで、自動的に生成された XAML を次の XAML に置き換えます。

    <ResourceDictionary
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:PropertyEditing="clr-namespace:Microsoft.Windows.Design.PropertyEditing;assembly=Microsoft.Windows.Design"
        xmlns:Media="clr-namespace:System.Windows.Media;assembly=PresentationCore"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        x:Class="InlineEditorNamespace.EditorResources">
        <DataTemplate x:Key="BrushInlineEditorTemplate">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <ComboBox Grid.Column="0" Text="{Binding StringValue}">
                    <ComboBoxItem>Red</ComboBoxItem>
                    <ComboBoxItem>Blue</ComboBoxItem>
                    <ComboBoxItem>Green</ComboBoxItem>
                </ComboBox>
            </Grid>
        </DataTemplate>
    </ResourceDictionary>
    
  11. ソリューションをビルドします。

テンプレートのカプセル化とインライン エディタの登録

インライン エディタ用のテンプレートの作成が完了したので、次にこのテンプレートをカスタム エディタとして使用するために PropertyValueEditor 派生クラスを作成し、新しいインライン エディタを登録する必要があります。

インライン エディタをカプセル化および登録するには

  1. BrushInlineEditor という名前の新しいクラスを CustomControlLibrary.Design プロジェクトに追加します。

  2. BrushInlineEditor のコード エディタで、自動的に生成されたコードを次のコードに置き換えます。

    namespace InlineEditorNamespace
    {
        using System;
        using System.Collections.Generic;
        using System.Text;
        using Microsoft.Windows.Design.PropertyEditing;
        using System.Windows;
        using InlineEditorNamespace;
    
        public class BrushInlineEditor : PropertyValueEditor
        {
            private EditorResources res = new EditorResources();
    
            public BrushInlineEditor()
            {
                this.InlineEditorTemplate = res["BrushInlineEditorTemplate"] as DataTemplate;
            }
        }
    }
    
  3. Metadata という名前の新しいクラスを CustomControlLibrary.Design プロジェクトに追加します。

  4. Metadata のコード エディタで、自動的に生成されたコードを次のコードに置き換えます。

    namespace InlineEditorNamespace
    {
        using System;
        using System.Collections.Generic;
        using System.Text;
        using Microsoft.Windows.Design.Metadata;
        using System.ComponentModel;
        using Microsoft.Windows.Design.PropertyEditing;
        using System.Windows.Media;
        using System.Windows.Controls;
        using System.Windows;
        using CustomControlLibrary;
    
        // Container for any general design-time metadata that we want to initialize.
        // Designers will look for a type in the design-time assembly that implements IRegisterMetadata.
        // If found, they will instantiate it and call its Register() method automatically.
        internal class Metadata : IRegisterMetadata
        {
    
            // Called by Cider to register any design-time metadata
            public void Register()
            {
                AttributeTableBuilder builder = new AttributeTableBuilder();
                builder.AddCustomAttributes
                    (typeof(CustomControl1), 
                    Control.BackgroundProperty,
                    PropertyValueEditor.CreateEditorAttribute(
                        typeof(BrushInlineEditor)));
                MetadataStore.AddAttributeTable(builder.CreateTable());
            }
        }
    }
    
  5. ソリューションをビルドします。

インライン値エディタのテスト

インライン値エディタはこれで完成し、使用できる状態になりました。後はテストするだけです。インライン エディタをテストするには、WPF アプリケーション プロジェクトをソリューションに追加し、カスタム コントロールを WPF アプリケーションに追加してから、インライン エディタの動作を確認します。

インライン値エディタをテストするには

  1. Visual C# の DemoApplication という名前の WPF アプリケーション プロジェクトをソリューションに追加します。

    WPF デザイナで Window1.xaml が開きます。

  2. CustomControlLibrary プロジェクトへの参照を追加します。

  3. Window1.xaml の XAML ビューで、自動的に生成された XAML を次の XAML に置き換えます。この XAML により、CustomControlLibrary 名前空間への参照が追加され、CustomControl1 カスタム コントロールが追加されます。ボタンは、赤い背景色でデザイン ビューに表示されます。これは、コントロールがデザイン モードであることを示します。ボタンが表示されない場合は、デザイナの一番上の情報バーをクリックして、ビューの再読み込みを行う必要があります。

    <Window x:Class="DemoApplication.Window1"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300" xmlns:my="clr-namespace:CustomControlLibrary;assembly=CustomControlLibrary">
        <Grid>
            <my:CustomControl1 Margin="30,30,30,30" Name="customControl11">Button</my:CustomControl1>
        </Grid>
    </Window>
    
  4. デザイン ビューでコントロールを選択します。

  5. [プロパティ] ウィンドウで、Background プロパティの横にあるドロップダウン ボタンをクリックします。新しいインライン エディタを表す小さな色選択リストが、既定の色リストの代わりに表示されます。選択できる色は、赤、青、および緑です。

  6. ドロップダウン リストで色を選択します。カスタム コントロールの背景が、その色に変更されます。

次の手順

さらに高度なプロパティ エディタについては、外部エディタを作成する方法を説明している「チュートリアル : カラー エディタの実装」を参照してください。

参照

処理手順

チュートリアル : カラー エディタの実装

方法 : 値エディタを作成する

その他の技術情報

カスタム エディタの作成

WPF デザイナの機能拡張