1

ItemsControlをサブクラス化して(EnhancedItemsControlと呼びましょう)、ScrollViewerTemplate依存関係プロパティを公開します。これにより、ユーザーは、使用するScrollViewerの独自のテンプレートをオプションで指定できます。私はこのようにやっています:

public ControlTemplate ScrollViewerTemplate
{
   get { return (ControlTemplate)GetValue(ScrollViewerTemplateProperty); }
   set { SetValue(ScrollViewerTemplateProperty, value); }
}

public static readonly DependencyProperty ScrollViewerTemplateProperty =
   DependencyProperty.Register(
   "ScrollViewerTemplate", 
   typeof(ControlTemplate), 
   typeof(EnhancedItemsControl),
   new UIPropertyMetadata(new ScrollViewer().GetValue(ScrollViewer.TemplateProperty))); //This doesn't work for me

EnhancedItemsControlのデフォルトのスタイルでは、次のようにScrollViewerを含めます。

<ScrollViewer
   Template="{TemplateBinding ScrollViewerTemplate}"
   ...
>
    <ItemsPresenter
    ...
    />
</ScrollViewer>

これは、ユーザーがScrollViewerTemplateを指定した場合に機能しますが、デフォルト値のままにすると、ScrollViewerは表示されません(おそらく、テンプレートが空であるため)。テンプレートをnull以外の場合にのみ使用し、それ以外の場合はデフォルトのテンプレートを使用するようにWPFに指示するにはどうすればよいですか?(テンプレートがnullでない場合にのみ、トリガーを使用してテンプレートを設定できることに気付きましたが、各コントロールのすべてのカスタムプロパティにトリガーを設定するというアイデアは好きではありません...)

スタイルにも同様の問題があります。ユーザーにScrollViewerスタイルを指定させたいが、ユーザーが指定しなかった場合、ScrollViewerStyleの値はnull(に等しい<ScrollViewer Style="{x:Null}" />)になり、デフォルトのスタイルが適用されなくなります。

これを解決する方法は?ありがとうございました!

4

2 に答える 2

1

あなたは少しだけを除いてすべてを正しくやっています.あなたが指定しているデフォルト値UIPropertyMetadataは実際にはnullScrollViewerです.

ScrollViewerTemplateプロパティを定義する代わりに、プロパティを定義しScrollViewerStyleます。

public Style ScrollViewerStyle
{
    get { return (Style)GetValue(ScrollViewerTemplateProperty); }
    set { SetValue(ScrollViewerTemplateProperty, value); }
}

public static readonly DependencyProperty ScrollViewerTemplateProperty =
    DependencyProperty.Register(
        "ScrollViewerStyle", 
        typeof(Style), 
        typeof(EnhancedItemsControl), 
        new UIPropertyMetadata(null));

そして、コントロールのデフォルト スタイルで、スタイルのデフォルト値を次のように指定します。

<Setter Property="ScrollViewerStyle" Value="{StaticResource {x:Type ScrollViewer}}"/>

これは実際には、現在のテーマで定義されている ScrollViewer スタイルにデフォルト設定されます。

于 2010-01-02T13:39:32.547 に答える
1

TemplateBinding を使用する代わりに、Binding を TemplatedParent の RelativeSource と共に使用できます。このようにして、バインディングでコンバーターを使用できるようになります。次に、Binding の Converter(IValueConverter) を宣言し、ScrollViewerTemplate プロパティが null のときに既定の Template を返します。

詳しくは

于 2010-01-02T04:55:59.087 に答える