私は何かを見逃しているだけかもしれませんし、今日は私の日ではないかもしれませんが、私がやろうとしていることが失敗し続けています.
MyContentControl というカスタム コントロールがあります。次のようになります。
public class MyContentControl : ContentControl
{
static MyContentControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyContentControl), new FrameworkPropertyMetadata(typeof(MyContentControl)));
}
public DockPanel DifferentLook
{
get;
set;
}
public string Txt
{
get;
set;
}
protected override void OnInitialized(EventArgs e)
{
if (this.DifferentLook != null)
{
this.Content = this.DifferentLook;
}
Binding b = new Binding("Txt");
b.Source = this;
this.SetBinding(ContentProperty, b);
base.OnInitialized(e);
}
}
これがそのテーマです:
<Style TargetType="{x:Type local:MyContentControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyContentControl}">
<Border Background="{TemplateBinding Background}" Margin="{TemplateBinding Padding}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
SnapsToDevicePixels="True">
<ContentPresenter VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
これはメインウィンドウです:
<local:MyContentControl Txt="texty text">
<local:MyContentControl.DifferentLook>
<DockPanel>
<TextBlock Text="Content = " DockPanel.Dock="Left"/>
<ContentPresenter DockPanel.Dock="Left"/>
</DockPanel>
</local:MyContentControl.DifferentLook>
</local:MyContentControl>
「DifferentLook」が指定されていない場合、コントロールでデフォルトの ControlTemplate 内で定義された ContentPresenter を使用したいと考えています。
DifferentLook が設定されている場合は、コントロールを別の外観で表示する必要があります。
メソッド OnInitalized を参照してください。
問題は、DifferentLook を適用すると、DifferentLook.ContentPresenter が機能していないように見えることです。
DifferentLook.ContentPresenter がコンテンツを正しく適用しないのはなぜですか?
ウィンドウの出力は「texty text」ですが、「content = texty text」である必要があります。
編集:これはライト バージョンです。私はこれを作成し、問題を説明するために物事をできるだけ単純に保ちました. 実際には、カスタム コントロールは少し大きく、ユーザーは ControlTemlates をオーバーライドできない場合があります。
与えられた要件でこれを解決する方法を考えていますか?