2016-01-20 9 views
8

TreeViewに基づいて再利用可能なカスタムコントロールを作成しています。カスタムコントロールライブラリのDependencyObjectにスタイルを適用する方法

public GridViewColumnCollection Columns 
    { 
     get { return (GridViewColumnCollection)GetValue(ColumnsProperty); } 
     set { SetValue(ColumnsProperty, value); } 
    } 

    public static readonly DependencyProperty ColumnsProperty = 
     DependencyProperty.Register("Columns", typeof(GridViewColumnCollection), typeof(TreeListView), new PropertyMetadata(new GridViewColumnCollection())); 

これは私がXAMLの列の束を指定することができます:私は、カスタムコントロールの上に、このようなコントロールの列、のための依存関係プロパティを作成しました。キャッチは、カスタムセルテンプレートを持つために最初の列が必要だということです。しかし

<Style TargetType="{x:Type local:TreeGridViewColumn}"> 
    <Setter Property="CellTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <Border Background="Black" /> <!-- Just for example --> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

public class TreeGridViewColumn : GridViewColumn 
{ 
} 

、その後、カスタムコントロールのためにGeneric.xamlにそれを所望のスタイルを与える:私は、GridViewColumnからクラスを派生させることによって、このような何かをこれにアプローチするつもりでしたスタイルはTreeGridViewColumnのインスタンスには適用されません。私はおそらく追加する必要があることを知っている:GridColumn基本クラスがFrameworkObjectないよう

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

は、しかし、私は、これを行うことはできません、それはのDependencyObjectです。カスタムコントロールライブラリで定義されたGridViewColumnの子孫にスタイルを適用するにはどうすればよいですか?

+1

GridViewColumnにスタイルを適用することはできません。これは、FrameworkElementではなく、スタイル可能ではないためです。 Styleプロパティはありません。 – Clemens

+0

@クレメンス:正しい。私はこの質問を書いたときにこれを説明することができたと思います。私は、自分のニーズに合わせてオーバーライドされたCellTemplateを使ってGridViewColumnの派生物を作成しようとしています。 Reflectorを使用してDataGridの列でこれを行う方法(テキスト列など)を見てみましたが、残念ながらデフォルトのテンプレートをコードで手動で作成するようです。彼らのテンプレートは1つまたは2つのフレームワーク要素でしかないので、どちらにしても問題ありません。私のテンプレートはあまりにも複雑すぎて実用的ではないので、別のルートを探す必要があります。 – user3690202

答えて

1

考えてみましょう:TreeGridViewColumnは、幅や高さなどの列自体の重要な情報を保持するダミーオブジェクトである必要があります。したがって、TreeGridViewColumnからFrameworkElementを作成しないでください。ここでは、TreeGridViewColumnを使用して最終的にどのようになるかの例を示します。

 <TreeGridViewColumn Header="First Col" Width="50"> 
      <TreeGridViewColumn.CellTemplate> 
       <DataTemplate> 
        <Button> 
         click me 
        </Button> 
       </DataTemplate> 
      </TreeGridViewColumn.CellTemplate> 
     </TreeGridViewColumn> 

あなたは準備ができて自分の測定を呼び出すことによってFrameworkElementsを扱う独自のカスタムパネルを作成し、あなたが望む方法列とセルを配置できるようにする方法を配置するために、私はあなたにお勧めの列とセルを表示するために一度

。あなたはあなたのカスタムパネルクラスの中で数学をやることになります。それは、TreeGridViewをプログラミングするのに1ヶ月を費やすことになります。私は、ショートカットを取ってそのようなことのコードをダウンロードすることをお勧めします。すでにオンラインでTreeListViewsはほとんどありません。ただ、自分のDLLを取ると、それはあなたのために

EDITうまくいくかどうかを確認:ここ

[OK]をすることは、あなたの問題を解決することができる方法の提案です。など、そのちょうど提案

DefaultTextColumnDataクラスは、列幅などのすべての必要なに関する情報を保持するダミーオブジェクトである、

DataGridCellControlは、セルを描くことのFrameworkElementになります。そのFrameworkElementは、generic.xamlリソースディクショナリに定義されたスタイルを持ちます。

合計すると、DefaultTextColumnDataは列自体のすべての情報を保持します。 DataGridCellControlは、その列に20個のセルがある場合に備えて、20個のインスタンスを持つコントロールになります。

DataGridCellControlは、その列について知っている必要があります。 これはDataGridCellControlのコードは似てどのように見えるかです:

class DefaultTextColumnData : DataGridColumn 
{ 
} 

class ComplexColumnData : DataGridColumn 
{ 
} 

class DataGridCellControl : Control 
{ 
    public DataGridColumn Column 
    { 
    get; set; 
    } 

    public DataTemplate DefaultTextCellTemplate 
    { 
    get; set; 
    } 

    public override Size MeasureOverride(Size size) 
    { 
    ... 
    if(this.Column is DefaultTextColumnData) 
    { 
    this.Template = this.DefaultTextCellTemplate 
    } 

    if(this.Column is ComplexColumnData) 
    { 
    this.Template = ... 
    } 
    ... 
    return new Size(30, 30); 
    } 
} 

DefaultTextCellTemplateはあなたのジェネリックに設定されます。xamlは次のようになります。

<Style TargetType={x:Type DataGridCellControl}> 
<Setter Property="DefaultTextCellTemplate"> 
    <Setter.Value> 
    <DataTemplate> 
    <TextBlock Background="Black" Margin="5"/> 
    .... 

どのようにリソース辞書のデフォルトセルテンプレートを設定しますか。

+0

ありがとう、私はすでに知っているこの部分は働いている。私が他の質問にお答えしたら、実際の問題は、私が特化したいと思っていた列の1つがあり、あらかじめ割り当てられたセルテンプレートがあることです。テキスト、チェックボックス、ドロップダウンなどのために、DataGridに事前設定された列の範囲があるのと同じです – user3690202

+0

thatsどのセルテンプレートが対象ですか? –

+0

まったく同じことを書き換えることができないので上からコピーします。私のニーズに合わせてオーバーライドされたCellTemplateを使ってGridViewColumnの派生物を作成しようとしていますが、Reflectorを使ってDataGridの列がどのようにこれを行うかを調べました。テンプレートは手動でコードに入れられますが、テンプレートは1つまたは2つのフレームワーク要素にすぎないため、どちらのテンプレートも実用的ではありませんので、別のルートを探す必要があります。 – user3690202

関連する問題