2011-01-28 8 views
5

なぜこれは機能しませんか?Silverlightデフォルトのコンテンツプレゼンターのコンテンツ

その後、コントロールテンプレートでカスタムコントロールに適用されるスタイルで

...

<Setter Property="ChromeContent"> 
    <Setter.Value> 
    <Grid /> 
    </Setter.Value> 
</Setter> 

...:カスタムコントロールのgeneric.xaml

...

<ContentPresenter Grid.Column="0" 
    x:Name="ChromeContentPresenter" 
    Content="{TemplateBinding ChromeContent}" /> 

ChromeContentのperty ...

public Object ChromeContent 
{ 
    get { return (Object)GetValue(ChromeContentProperty); } 
    set { SetValue(ChromeContentProperty, value); } 
} 
public static readonly DependencyProperty ChromeContentProperty = 
    DependencyProperty.Register("ChromeContent", typeof(Object), 
    typeof(casPopup), null); 

ご覧のとおり、任意のオブジェクトが必要です。私はグリッドに変更しようとしましたが、それは助けになりませんでした。ただ_Failedプロパティに割り当てる「System.Windows.Controls.ContentPresenter.Content」

私はセッターからグリッドを削除する場合は奇妙なことに、以下が正常に動作しますND:

それは(ジャバスクリプトから)このエラーがスローされます私は苦労のアンダーを抱えている

Grid g = new Grid(); 
    g.Width = 100; 
    g.Height = 25; 
    g.Background = new SolidColorBrush(Colors.LightGray); 
    ChromeContent = g; 

<Setter Property="ChromeContent" Value="DEFAULT" /> 

また、これはコントロールクラスでOnApplyTemplateメソッドからあまりにも動作します:テキストを使用generic.xamlで定義されているグリッドのデフォルトのコンテンツが動作しないようにしています。誰もこの問題について知識がありますか?

ご協力いただきありがとうございます。

<Setter Property="ChromeContent"> 
    <Setter.Value> 
    <Grid /> 
    </Setter.Value> 
</Setter> 

あなたはリソースディクショナリまたはスタイルの値として直接UIElementを含めるべきではありません - :

答えて

6

これが問題です。そのスタイルが何らかの記述子であると見えるかもしれませんが、そうではありません。スタイル内の値は、それらが保持するオブジェクトの構築されたインスタンスです。あなたのスタイルはGridの単一インスタンスを保持します。そのスタイルを使用してChromeContentプロパティに割り当てると、同じ単一のグリッドのインスタンスを取得しようとします。

UIElementは、1つの親の子にしかなりません。あなたのコントロールが2つのインスタンスが構築された場合、どうなりますか?両方のコントロールに同じのグリッドのインスタンスを割り当てようとすると(Silverlightを許可する場合)

これがControlTemplateDataTemplateなどのテンプレートの1つの理由です。これらのマークアップは、Xamlが最初に解析されるときではなく、テンプレートが使用されるたびに呼び出されます。

編集

DataTemplate、あなたがタイプの別のプロパティをデフォルトで設定される必要があり、あなたに補足質問に答えるために: -

<Setter Property="ChromeContentTemplate"> 
    <Setter.Value> 
    <DataTemplate> 
     <Grid /> 
    </DataTemplate> 
    </Setter.Value> 
</Setter> 

プロパティ: -

public Object ChromeContentTemplate 
{ 
    get { return (DataTemplate)GetValue(ChromeContentTemplateProperty); } 
    set { SetValue(ChromeContentTemplateProperty, value); } 
} 

public static readonly DependencyProperty ChromeContentTemplateProperty= 
    DependencyProperty.Register("ChromeContentTemplate", typeof(DataTemplate), 
    typeof(casPopup), null); 

コントロールテンプレート: -

<ContentPresenter Grid.Column="0" 
    x:Name="ChromeContentPresenter" 
    Content="{TemplateBinding ChromeContent}" 
    ContentTemplate="{TemplateBinding ChromeContentTemplate" /> 
+0

非常に興味深いです。私はこれを知らなかった。もし私が次のような質問をしたら、私はコントロールテンプレートでこれをどうやってやるのだろうか? ContentPresenterにデフォルトのマークアップを配置しようとすると、グリッドなどを追加できません。ユーザーのコンテンツが提供された場合、私のコンテンツを上書きするようにしたいので、ここからどこに行くのかは分かりません。 – maulkye

+0

手伝ってくれてどうもありがとう! – maulkye

関連する問題