1

と既存のコンテンツの両方をサポートするユーザー コントロール ( ) を持つことは可能ですか? s は Control ( ) から継承する場合にのみ使用する必要があることを理解しましたが、UserControl.xaml が空の場合にも使用できることがわかりました。public MyControl: UserControlControlTemplateControlTemplatepublic MyControl: ControlUserControl

次のように、2 つの長方形が並んでいるコントロールがあるとします。

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid ShowGridLines="true" Height="100" Width="100"> 
        <Grid.ColumnDefinitions> 
            <ColumnDefinition/> 
            <ColumnDefinition/> 
        </Grid.ColumnDefinitions> 
        <Rectangle Name="left" Grid.Column="0" Height="90" Fill="LightBlue"/> 
        <Rectangle Name="right" Grid.Column="1" Height="100" Fill="LightGreen"/> 
    </Grid> 
</Page> 

コントロールのユーザーが、それらの長方形を自分が使いたいものに置き換えられるようにしたいと思いFrameworkElementます。だから私はが必要ControlTemplateです。

しかし、99% のケースで、コントロールのユーザーは既存の機能に満足しているので、次のように言ってもらいたいと思います:

コードビハインド:

mycontrol.Left.Fill = ....

XAML:

<mycontrol>
<mycontrol.Left.Fill = "Red"/>
</mycontrol>

コントロール テンプレートをサポートしている場合、実際には UI 要素や xaml がないため、これは不可能のようです。コードビハインドファイルしかありません。私は、DependencyProperty Leftあまり役に立たないコンテンツを保持する何らかのコンテナを持っていない限り、可能だと思います。コード ビハインド ファイルでグリッドを作成する必要があります。良い考えではないようです。

そして最後に、ユーザーがパーツのタイプを指定できるようにジェネリックを使用できるようにしたいと思います。

MyControl mycontrol<TLeft, TRight> = new MyControl<Rectangle, Button>();

これは、型の安全性 (FrameworkElement正しい型にキャストする必要がない) のため、コード ビハインドに役立ちます。残念ながら、ジェネリックは XAML 側で実際にサポートされているとは思いません。

この問題の解決策はありますか、それとも本当に「ControlTemplates をサポートするために Control から継承しますが、コントロールの使いやすさを失います。使いやすさをサポートするために UserControl から継承しますが、ControlTemplateサポートを失います」?

4

1 に答える 1

2

コントロールに依存関係プロパティを追加します。

public static DependencyProperty LeftFillProperty = DependencyProperty.
   Register("LeftFill", typeof(Brush), typeof(MyControl));

public Brush LeftFill
{
   get { return (Brush)GetValue(LeftFillProperty); }
   set { SetValue(LeftFillProperty,value); }
}

次に、デフォルトのコントロール テンプレートで次を使用します。

<Rectangle Name="left" Grid.Column="0" Height="90" Fill="{TemplateBinding LeftFill}"/>

これにより、使用することができます(C#)

ctrl.LeftFill = Brushes.Red;

または (XAML)

<c:MyControl LeftFill="Red"/>

既定のテンプレートを使用する場合、および誰かが新しいコントロール テンプレートを作成する場合は、LeftFill プロパティをどうするか (または完全に無視するか) を決定する責任があります。

ところで、名前を「左」と「右」から別のもの (「MasterPanel」と「DetailPanel」、「FoldersArea」と「FilesArea」、コントロールの論理的な使用法が何であれ) に変更することを検討する必要があります。これにより、デフォルトのテンプレートを別のレイアウトで同じデータを表示するテンプレートに置き換える人の問題 (たとえば、左右ではなく上下)。

于 2009-02-08T11:01:16.073 に答える