2

そのため、タブコントロールにタブを追加したり、新しいプロジェクトごとにタブを追加したりできるプロジェクトに取り組んでいますTabItem。プログラムで生成されたコントロールがたくさんあります。新しく作成したテンプレートに簡単に追加できるテンプレートをXAMLで作成する方法はありTabItemますか?

簡単な例として、TabPageを含むWPFフォームがあるとします。

<Window>
 <Grid>
  <TabControl></Tabcontrol>
 </Grid> 
</Window>

そして、各TabPageに3つのボタンを追加したいと思います。

<Window>
 <Grid>
  <TabControl>
   <TabItem>
    <Button/>
    <Button/>
    <Button/>
   </TabItem>
  </TabControl>
 </Grid> 
</Window>

XAMLエディター(おそらくVS2012)でこの3つのボタンのテンプレートを編集できるようにしたいと思います。これらの変更は、それぞれに追加されるテンプレートに反映されますTabItem

私は周りを見回しましたが、WPFテンプレートの記事のほとんどは、私が望んでいるものではないように見えるカラーリングまたはスタイルテンプレートに関するものです。私の現在のアプローチによると、TabItemプログラムで追加することは機能しますが、テンプレートの編集が少し面倒になり、WPFの哲学に反して、コードをデザインから切り離すと私は信じています。

私はWPFにかなり慣れていませんが、WinFormsよりも優れている点と利点をすでに理解しているので、その方法で販売されていますが、私は新しいため、用語が少し混乱することがあり、検索の試みも失敗します。時々。

どんな助けでもいただければ幸いです。十分に説明できなかった場合は、お知らせください。

4

4 に答える 4

1

UserControlを使用してみてください。

たとえば、3 つのボタンのグループを単純なコントロールとして使用できます。これは xaml ファイルによって定義され、この xaml ファイルへの変更は、ユーザー コントロールが追加された場所に反映されます。

于 2013-01-07T10:40:16.677 に答える
1

TabItemは最終的にContentControlから継承します。つまり、コンテンツ コントロールに表示される実際のコンテンツを装飾できる方法でテンプレート化できます。

<Style TargetType="TabItem">
  <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type TabItem}">
          <Grid>
            <Grid.RowDefinitions>
              <RowDefinition Height="*" />
              <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <ContentPresenter Grid.Row="0" />
            <StackPanel Grid.Row=1>
              <!-- Your buttons -->
            </StackPanel>
          </Grid>
        </ControlTemplate>
      </Setter.Value>
  </Setter>
</Style>

ContentPresenterを配置する場所は、ContentControl (またはこの場合は TabItem) のコンテンツが配置される場所です。

たとえば、これを使用して、コレクションの表示に検索/強調表示機能を追加しました。デフォルトのテンプレートをコピーしてそこから変更することをお勧めします。テンプレート内でマークアップを再利用するのはかなり難しいため、これは厄介な部分です。

または、TabItem をそのままにして、TabItems 内で使用する目的の方法で ContentControl のスタイルを設定します...

<TabItem>
  <ContentControl Style="{StaticResource CommonButtons}">
    <!-- TabItem Contents -->
  </ContentControl>
</TabItem>

もちろん、ContentControl ビットは DataTemplate になる可能性があり、ItemsSourceにバインドすると、

<TabControl 
   ItemTemplate="{StaticResource CommonButtonsTemplate}" 
   ItemsSource="{Binding MyTabItemsData}" />
于 2013-01-07T11:34:07.900 に答える
1

@Olwaro が述べたように、おそらくUserControlを使用する必要があります。

あなたの例を考えると、UserControlこのXamlを使用できます(ユーザーコントロールはThreeButtonStackと呼ばれ、名前空間WpfApplication2に存在します):

<UserControl x:Class="WpfApplication2.ThreeButtonStack"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <UserControl.Resources>
        <Style TargetType="Button">
            <Setter Property="Margin" Value="5" />
            <Setter Property="Width" Value="75" />
        </Style>
    </UserControl.Resources>
    <StackPanel Orientation="Horizontal">
        <Button Content="OK" />
        <Button Content="Cancel" />
        <Button Content="Retry" />
    </StackPanel>
</UserControl>

次に、次のようにメイン アプリケーションで呼び出すことができます。

<Window x:Class="WpfApplication2.TabPageWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpfApplication2="clr-namespace:WpfApplication2"
        Title="TabPageWindow" Height="300" Width="300">
    <TabControl>
        <TabItem Header="Tab 1">
            <DockPanel>
                <wpfApplication2:ThreeButtonStack DockPanel.Dock="Bottom" HorizontalAlignment="Right"/>
                <TextBlock>Custom Content</TextBlock>
            </DockPanel>
        </TabItem>
        <TabItem Header="Tab 2">
            <DockPanel>
                <wpfApplication2:ThreeButtonStack DockPanel.Dock="Bottom" HorizontalAlignment="Right"/>
                <TextBox>Editing custom stuff</TextBox>
            </DockPanel>
        </TabItem>
    </TabControl>
</Window>

結果は次のようになります。

スクリーンショット

于 2013-01-07T11:28:03.883 に答える
0

TabPageクラスについてはわかりませんが、この種の問題を解決するには、Templateingを使用する代わりに、TabPageを継承してそこで機能するクラスを作成し、そのクラスに共通の機能を設定する方がよいでしょう。これが役立つことを願っています。

于 2013-01-04T14:06:08.653 に答える