17

XAMLを使用して外観を定義するユーザーコントロール(Silverlight)がある場合、カスタマイズされたバージョンを作成するにはどうすればよいですか?

つまり、MyControl.xamlとMyControl.xaml.csがあります

「SpecializedControl」子クラスが必要な場合はどうすればよいですか?新しいコードファイルを作成してから、MyControlから継承すると仮定します。しかし、基本クラスの外観を変更したい場合はどうすればよいですか?

4

4 に答える 4

8

Silverlight ではなく WPF について話していると思ってこれを書きましたが、これが役立つのに十分な重複があるかもしれないので、とにかく投稿します。

「基本クラスの外観を変更する」が「新しいテンプレートを提供する」ことを意味する場合、必要なのはおそらく UserControl ではなく CustomControl です。

これを実現する最善の方法は、Button や ListBox などの他の Microsoft コントロールによって設定された例に従うことです。

  1. Control (またはコントロールに最も近いもの) から直接派生するクラスを作成します。
  2. プロパティをコントロールに公開する必要がある場合 (たとえば、ボタンのテキストなど)、それらを DependencyProperties として適切に定義していることを確認してください。
  3. こちらで説明されているように、Themes/generic.xaml という名前の ResourceDictionary を作成し、テンプレートを含むクラスのスタイルを追加します (スタイルにキーを与えないでください)。
  4. コントロールから値を取得する必要があるコントロール上の要素のプロパティには、TemplateBindings を使用します。
  5. テンプレートの要素にイベント ハンドラーをアタッチする必要がある場合は、一意の名前を付けます。Microsoft では、これらの名前に "PART_" というプレフィックスを付ける規則を使用しています。これは、一貫性を保つために良いことだと思いますが、厳密には必須ではありません。
  6. 繰り返しますが、イベント ハンドラーをアタッチする必要がある場合は、OnApplyTemplate() をオーバーロードします。このメソッドでは、古いイベント ハンドラーをデタッチし (メモリ リークは絶対に避けたいものです!)、テンプレートで指定した名前の要素を探します。それらが見つかったら、必要に応じてイベント ハンドラーをアタッチします。 .

これは、単純に UserControl から派生させるよりもはるかに手間がかかりますが、組み込みコントロールの場合と同様に、コントロールを完全に再テンプレート化したい場合は、この方法が適しています。

一方、背景を変更したり、コマンドをユーザー アクションに関連付けたりするなど、ある程度限定されたカスタマイズを提供することだけが必要な場合は、DependencyProperties を公開することをお勧めします。コントロールのスタイル、またはコントロールのインスタンス自体に設定できます。

継承されたコントロールの外観をカスタマイズしたいとおっしゃった場合、プロセスは非常に似ています。新しいテンプレートを使用して、新しいコントロールのデフォルト スタイルを追加するだけです。さらにイベント ハンドラを追加する必要がある場合は、必ず base.OnApplyTemplate() を呼び出してください。

于 2008-10-22T14:29:56.287 に答える
5

Mihnea のリンクが説明しているように、最も簡単な解決策は、XAML に名前空間を追加することです。

C#

public class MyBase : UserControl
{
}

public class FirstUserControl : MyBase
{
...
}

XAML

<local:MyBase 
    x:Class="FirstUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:local="YourAssembly" ...>

    <!-- Sticking with UserControl instead of local:MyBase makes this clearer -->
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                ..
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>

..Your XAML
</local:MyBase>
于 2010-06-24T13:35:29.873 に答える
5

わかりませんが、単純なオブジェクトだけで物事を行うのが好きです。MicrosoftStuffThatAlmostWorks ではなく SimpleThingsLikeInheritance を使用して外観と動作をカスタマイズできるように、XAML で設計されたコントロールを継承階層の外に滑り込ませる簡単な方法を説明する記事を次に示します。

http://gen5.info/q/2009/02/10/subverting-xaml-how-to-inherit-from-silverlight-user-controls/

于 2009-02-11T17:16:36.080 に答える
0

上記のリンクで説明されているように、ラッパーを使用してこれを解決できます。しかし、戦略パターンを使用してこの問題を解決することもできます。

この記事では、これら 2 つの方法をどのように実装するかを説明します。 http://www.lab101.be/2008/07/silverlight-usercontrol-inheritance/

于 2009-03-06T11:46:25.250 に答える