2009-08-06 12 views
3

現在、カスタムコントロール(WPF DataGridに基づく)を作成しています。私がしたいのは、データグリッドにデフォルトのスタイルを設定することです。現在、動作するStyleプロパティを設定しています。しかし、私の問題は、fxを変更するスタイルを作成するときに発生します。主なアプリケーションapp.xamlの背景色。私のすべての「デフォルト」のスタイルが失われ、DataGridはバックグラウンドのプロパティセットでのみすべて標準に見えます。カスタムコントロールのデフォルトスタイルの作成

デフォルト値を適用するグリッドの各プロパティで、幸運のないOverrideMetadataを使用しようとしました。私もコンストラクタの各プロパティを設定しようとしましたが、プロパティの優先順位のためにメインアプリケーションのスタイルは適用されません。

アイデア?あなたは辞書のキーなしでスタイルを作成する場合は、Window.Resourcesでそれを指定した場合、それはあなたが(あなたのスタイル辞書をインポートする範囲内で指定したタイプのすべてのオブジェクトのスタイルを設定します

+0

は、あなたのカスタムスタイルで「BASEDON」を設定したことがありますか? –

+0

さて、私はそれについて考えましたが、デフォルトのスタイルを取得するためにグリッドコントロール上にプロパティを作成し、次にapp.xamlで新しいスタイルを作成してBasedOnで使用するプロパティを作成する必要があります。私はちょうど良い解決策があると思った。すべてのサードパーティのコントロールを使用すると、新しいスタイルを作成し、完全なスタイルを再度実装することなくいくつかのプロパティを設定することができます。 –

答えて

4

事前に

感謝App.xamlで指定した場合は、そのウィンドウのスコープがあります...あなたは画像を取得します)。

<Style TargetType="{x:Type Button}"> 
    <Setter Property="FontFamily" Value="Times New Roman" /> 
    <Setter Property="FontSize" Value="30" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
    <Setter Property="Background" Value="#FFCA5132" /> 
    </Style> 

これにより、すべて同じスタイルになります。

これは非常に強力な機能です。 UI要素だけでなく、あらゆるオブジェクトのスタイルを設定することができます。 「Person」オブジェクトのようなデータエンティティの1つをスタイルすることができます。また、それらの要素が視覚的に使用されると、List型にPerson型のリストをバインドするなど、指定されたとおりにスタイルが設定されます。ネイティブUI要素ではありません。これは、WPFがそのコントロールについて「無意味」になれる方法です。

+0

問題は、私が作成した既定のスタイルがグリッドのリソース辞書にないことです。 私はアプリで新しいスタイルを作成します。私のメインアプリでXAML: <スタイルのTargetType =「データグリッド」> <=「グリーン」setterプロパティ=「背景」バリュー/> 背景が緑色になりませんので、グリッド・リソースディクショナリのデフォルトスタイル –

+0

データグリッドの各プロパティにデフォルト値を追加して、新しいスタイルがコントロールに設定されたときにすべてのスタイルがオーバーライドされないようにする必要がありますか? –

+0

BasedOn属性を "DataGrid"に設定して別のスタイルを作成し、その特定のインスタンスに対して上書きしたいいくつかのものを上書きする必要があります。 –

11

staticコンストラクタでこれを設定しましたか?

DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomType), new FrameworkPropertyMetadata(typeof(MyCustomType))); 

はまた、カスタムコントロールの種類に等しいリソース・スタイルのキーですか?

TargetTypeがあなたのコントロールに設定されていても、それは他のキーセットを持つことはできません。

総会はまた、次の属性でマークする必要があります。

[assembly: ThemeInfo(
    //where theme specific resource dictionaries are located 
    //(used if a resource is not found in the page, 
    // or application resource dictionaries) 
    ResourceDictionaryLocation.None, 

    //where the generic resource dictionary is located 
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries) 
    ResourceDictionaryLocation.SourceAssembly 
)] 
+0

Hey kek444 私はグリッドがレンダリングされるときに何も表示されないコードを含めるとグリッドが表示されるようにしました。私は現在、BasedOnカスタムスタイルを動作させようとしています。 –

+0

回答の追加情報が提供されています。 –

+0

私は実際に私のコントロールのタイプに設定されたキーを持っていませんでした。私はそれを修正しましたが、まだコントロールが表示されるはずの空の領域があります。私はthemes/generic.xamlファイルにスタイルを置き、[assembly:ThemeInfo(ResourceDictionaryLocation.SourceAssembly、ResourceDictionaryLocation.SourceAssembly)]タグをassemblyinfoファイルに追加しました。これはそれと関係がありますか? –

関連する問題