0

リソース ディクショナリ ファイルで次のようにControlTemplate定義しています。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 <ControlTemplate x:Key="ctlTemplate">
    <ControlTemplate.Resources>
        <StackPanel x:Key="sp" x:Name="sp">
                <TextBlock Name="tplTextBlock" HorizontalAlignment="Center"/>
                <DataGrid  Name="tableBlock" AutoGenerateColumns="False"/>
            </StackPanel>
    </ControlTemplate.Resources>
 </ControlTemplate>
</ResourceDictionary>

から派生したクラスがあり、そのプロパティを上記Thumbに設定しようとしています:TemplateControlTemplate

Dim ct As ControlTemplate = CType(Application.Current.Resources("ctlTemplate"), ControlTemplate)
Dim tb As MovableTableBlock = New MovableTableBlock 'Derives from Thumb
tb.Template = ct
tb.UpdateLayout()

問題は、Thumbがまったくレンダリングされないことです。ただし、ControlTemplate.Resourcesタグを削除した結果、のx:Keyプロパティも削除するとStackPanelThumbレンダリングされます。x:Keyのプロパティを設定する理由は、との子StackPanelにアクセスして、それぞれテキストとデータ バインディングを設定するためです。基本的に、の子にアクセスしたいだけです。どうすればアクセスできますか?TextBlockDataGridStackPanel

編集:私はこれに変更ControlTemplateしました:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:VQ.Custom">
<Style TargetType="{x:Type local:MovableTableBlock}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MovableTableBlock}">
                <StackPanel x:Name="sp">
                    <TextBlock x:Name="tplTextBlock" HorizontalAlignment="Center"/>
                    <DataGrid  x:Name="tableBlock" AutoGenerateColumns="False"/>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</ResourceDictionary>

したがって、次のようにテンプレートを設定する必要はありません。

tb.Template = ct

これでレンダリングされましたが、ここでThumb提案されているように、まだ内部コントロールにアクセスできません。何らかの理由で、私がこれを行うときです:tb.TemplateNothing

Dim txtBlock As TextBlock = CType(tb.Template.FindName("tplTextBlock", tb), TextBlock)
4

1 に答える 1

0

暗黙的なスタイルを使用してテンプレートを設定できます。

    <Application x:Class="WpfApplication1.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:WpfCustomControlLibrary2;assembly=WpfCustomControlLibrary2"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
            <Style TargetType="local:MovableTableBlock">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="local:MovableTableBlock">
                            <StackPanel x:Name="sp">
                                <TextBlock Name="tplTextBlock" HorizontalAlignment="Center"/>
                                <DataGrid  Name="tableBlock" AutoGenerateColumns="False"/>
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Application.Resources>
    </Application>

    // No need to set Template or Style on MovableTableBlock, as it's done implicitly
    MovableTableBlock mtb = new MovableTableBlock();
    mtb.UpdateLayout(); // pointless to do...as not in visual tree yet

    .....your mtb needs to be added to the visual tree e.g. add as child of
    Grid or other element, so the style and template can be applied....your
    OnApplyTemplate won't be called till then.

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        TextBlock tb = Template.FindName("tplTextBlock", this) as TextBlock;
    }

上記のコードを試してみましたが、上記の方法を使用してテンプレートの TextBlock にアクセスできます。

テンプレートを変更しようとしている方法は、少し型破りです...カスタム コントロールを整理する方法について、以下にいくつかの提案があります。


特定の名前付き要素がテンプレートに存在することを「期待」するカスタム コントロールを作成する場合、それらを「パーツ」として名前を付け、カスタム コントロール クラスで [TemplatePart] 属性を使用するのが規則です。これは、コントロールを再テンプレート化する人が、再設計されたテンプレート内にあることが重要な部分を知るためです。

また、テキストと DataBinding を設定できるように、TextBlock と DataGrid にアクセスできることにも言及しています。

これを行う代わりに、カスタム コントロールでいくつかのプロパティを公開することを検討してください...テンプレートは、" {TemplateBinding ...}" または " {Binding ...RelativeSource={RelativeSource TemplatedParent} ...}" を使用してバインドします。

また、リソースからテンプレートを検索してコード ビハインドで設定することにより、テンプレートをカスタム コントロールに設定する方法は型破りです....デフォルト スタイルでそれを選択できるようにする必要があります。

説明に役立ついくつかのリンクを次に示します。

于 2012-08-12T13:59:48.813 に答える