2

Outlook 2007 と同じように NavigationPane を作成しました。Outlook では、Pane を折りたたんでサイド バーをクリックすると、Selected NavigationItem コンテンツがポップアップしていました。ControlTemplete で contentpresenter を使用して同じ動作を模倣しました (1 つは TabControl の SelectItemHost 用で、もう 1 つは Popup 用です)。しかし問題は、Popup が開いているとき、NavigationPane が離れているときにコンテンツを選択し、別のナビゲーション アイテムから同じナビゲーション アイテムに戻ったときに表示されることです。TabControl と TabItem を NavigationPane と NavigationPaneItem として使用しています。

2 つの ContentPresenter の ContentSource として「SelectedContent」を指定しています

4

1 に答える 1

5

必要に応じて、コントロール テンプレート内に2 つのオブジェクトを定義ContentPresenterし、両方を同じコンテンツ ソースに向けることができます。

<ControlTemplate x:Key="WeirdButton" TargetType="Button">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Border Grid.RowSpan="2" Background="{TemplateBinding Background}" />
        <ContentPresenter ContentSource="Content"/>
        <ContentPresenter ContentSource="Content" Grid.Row="1"/>
    </Grid>
</ControlTemplate>

ただし、これにはかなり珍しい副作用があります。同じビジュアルをビジュアル ツリーの 2 つの場所に配置することはできないため、このテンプレートは、ボタンの子コンテンツがビジュアルではない (またはビジュアルから派生した) 場合にのみ期待どおりに機能します。コンテンツが他のタイプのデータで、ビジュアルがデータ テンプレートによって生成されている場合、すべてが期待どおりに機能します。ボタンの内容を文字列 ( <Button Content="OK"/>) に設定することもできます。

これと同じ効果がビジュアル ブラシで実現できることに注意してください。

<ControlTemplate x:Key="WeirdButton" TargetType="Button">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Border Grid.RowSpan="2" Background="{TemplateBinding Background}" />
        <ContentPresenter x:Name="presenter" ContentSource="Content"/>
        <Rectangle Grid.Row="1" 
                   Width="{Binding ActualWidth, ElementName=presenter}" Height="{Binding ActualHeight, ElementName=presenter}">
            <Rectangle.Fill>
                <VisualBrush Visual="{Binding ElementName=presenter}" Stretch="None" AlignmentX="Left"/>
            </Rectangle.Fill>
        </Rectangle>
    </Grid>
</ControlTemplate>

このアプローチの欠点は、ビジュアル ブラシでコントロールを操作できないことです。したがって、複製のボタン、テキストボックス、およびその他のコントロールもインタラクティブにしたい場合は、最初のテンプレートに近いアプローチに従う必要があります。

于 2011-05-13T13:12:38.523 に答える