XAMLでのユーザー定義のトップ・レベル・コントロール
-
21-09-2019 - |
質問
XAMLでこのような通常のUserControlルックスます:
<UserControl x:Class="mynamespace.foo" ...namespaces...>
<!-- content -->
</UserControl>
私はの線に沿って、私自身のトップレベルのオブジェクトを定義できるようにしたいのですが
<MyControl x:Class="mynamespace.mycontrol" ...namespaces...>
<!-- content -->
</UserControl>
MyControlとは、ユーザーコントロール自体から派生コンパイラが見つからない「MyControlと」文句
もちろん。これを回避する方法はありますか?
解決
ルートタグは、基本クラスです。デフォルトのウィンドウ1のルートは窓がある理由です。 > UserContolをメニューオプションの追加]を使用して... UserContolためのサブクラスを作成することである。
あなたはいくつかの共通の要素を持っているし、コントロールの基本クラスを使用する場合は、あなたは、ルートタグとして基本クラスを使用することができます。あなたは、XAML定義されたビジュアルツリーを持っている任意のクラスからクラスを派生することはできませんが、あなたのベースクラスがUserConrtolから派生することができます。
まず、あなたの基本クラスを定義します:
public class MyControlBase : UserControl
{
// ...
}
次に、あなたの特定の子クラスを作成します:
(あなたが自動的に作成UserControl1を始めて、そこからそれを変更することができます)。
public partial class MyControl1 : MyControlBase
{
public MyControl1()
{
InitializeComponent();
}
}
次に、このように見えるようにXAML側を変更します。
<MyNamespace:MyControlBase
x:Class="MyNamespace.MyControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:MyNamespace="clr-namespace:MyNamespace">
これはユーザーコントロール、他のものに建て由来カスタムコントロールを作るための素晴らしい方法です。これは、一般的にちょうどあなたができる場合は、基本的なUserConrtolsを使用し、あなたが持っている場合にのみ、カスタムコントロールを作成することを推奨します。
幸運、
他のヒント
XAMLであなたの名前空間を定義して、タグとしてあなたのコントロール名を使用します:
<Window ...
xmlns:my="..." />
<my:mycontrol ... />
</Window>
はありません。 XAMLはコードビハインドはMyControlとは行動的であるものを定義しているのと同様に、MyControlとは視覚的に何であるか宣言しています。 MyControlとの観点でMyControlとのビジュアルを定義すると、本当に意味がありません:それはあなたが明らかにしないだろうMyControlと、からMyControlとを導出する、コードビハインドで、同等のです。
また、WPFを使用すると、別の例から1つのユーザーコントロールクラスを派生させません。 BobsControlがユーザーコントロールであるならば、あなたは書き込み<local:BobsControl x:Class="MyNamespace.MyControl... />
ないことができます。私は視覚的な継承が一般的に有用ではありませんので、ユーザーコントロールは、基本クラスの内容を交換しなければならない外観(コンテンツ)がXAMLに焼きや派生クラスの内容を持っているためであると考えています。
ただし、がのそれを行うことができます。カスタムコントロールは、lookless(XAMLで定義されていない)です。あなたがそうはのカスタムコントロールなど、独自のトップレベルの要素を作成し、その中から「ユーザー」コントロールを導き出すことができます。 (あなたはこのルートを下る行う場合、あなたはおそらく、あなたのトップレベルの要素は、簡単に他のXAMLを含めることができるように、ContentControlにからカスタムコントロールを派生またはContentPropertyAttributeを適用することをお勧めします。)