17

TabItem を別の XAML に入れて、次のようなものを参照することは可能ですか:

<TabControl>
     <local:MyTabItem/>
</TabControl>



In Separate XAML:
<UserControl x:Class="MyProject.MyTabItem"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TabItem Header="MyTab">

    </TabItem>
</UserControl>

もちろんうまくいきませんが、どうすればいいのでしょうか?

4

4 に答える 4

37

単純にコードをより管理しやすくしたい場合は、ユーザー コントロールで各タブのデータを定義することをお勧めしますが、メインのタブ コントロールには TabItem を配置します。

元のコードが次のようなものであると仮定しましょう:

<TabControl>
    <TabItem Header="Tab 1">
        <Grid>
            <TextBlock Text="Tab Data" />
        </Grid>
    </TabItem>
</TabControl>

コードをより管理しやすくするために、タブの内容を次のような UserControl に分割できます。

<UserControl x:Class="WpfApplication19.Tab1Data"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             >
    <Grid>
        <TextBlock Text="Tab Data" />
    </Grid>
</UserControl>

次に、TabControl でそのユーザー コントロールを次のように使用します。

    <TabControl>
        <TabItem Header="Tab 1">
            <tabData:Tab1Data />
        </TabItem>
    </TabControl>

本当にユーザー コントロールに TabItem を含めたい場合は、最初にユーザー コントロールを作成してから、ユーザー コントロールのタイプを TabItem タイプに変更します (xaml ルート ノードとコードビハインド)。

これにより、次のようなタブ コントロールが残ります。

    <TabControl>
        <tabData:TabItem1 />
        <tabData:TabItem2 />
        <tabData:TabItem3 />
    </TabControl>

また、各 TabItem1 'User Control' は TabItem 型になります。次に例を示します。

<TabItem x:Class="WpfApplication19.TabItem1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Header="Tab 1"
         >
    <Grid>
        <TextBlock Text="Tab Data" />
    </Grid>
</TabItem>

前述したように、コード ビハインドを変更して、ユーザー コントロールの代わりに TabItem を拡張するようにしてください。

public partial class TabItem1 : TabItem
{
    public TabItem1()
    {
        InitializeComponent();
    }
}
于 2009-10-19T20:25:57.573 に答える
12

Tony Borresからの以前の回答は、すでに最も重要な側面をカバーしています。しかし、さらなるコメントは、コードビハインドからのアクセスを求めています。そこで、トニーの例を拡張して、この側面も示します。この回答は、必要な名前空間を示しています。私もトニーからの回答にそれらを追加しました。

コードを管理しやすくするために、ユーザーコントロールで各タブのデータを定義することをお勧めしますが、メインタブコントロールにはTabItemを含めます。この戦略は、たとえば、FxCop CA1505を回避する場合に役立ちます。複数のタブ項目でタブコントロールを使用する場合は、「保守不可能なコードを回避する」。

これが元のコードであると仮定しましょう。

<Window x:Class="WpfApplication19.MainWindow" ...>
    <TabControl>
        <TabItem Header="Tab 1">
            <Grid>
                <TextBlock Text="Data on Tab 1" Name="txtData1" />
            </Grid>
        </TabItem>
        <TabItem Header="Tab 2">
            <Grid>
                <TextBlock Text="Data on Tab 2" Name="txtData2" />
            </Grid>
        </TabItem>
    </TabControl>
</Window>

コードをより管理しやすくするために、タブの内容を次のようなUserControlに移動できます。

<UserControl x:Class="WpfApplication19.Tab1Data"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Loaded="OnControlLoaded"
             >
    <Grid>
        <TextBlock Text="Data on Tab 1" Name="txtData1" />
    </Grid>
</UserControl>

そして、次のようにTabControlで新しいユーザーコントロールを使用することができます。

<Window x:Class="WpfApplication19.MainWindow"
        xmlns:tabData="clr-namespace:WpfApplication19" ...>
    <TabControl>
        <TabItem Header="Tab 1">
            <tabData:Tab1Data x:Name="ucTab1Data" />
        </TabItem>
        <TabItem Header="Tab 2">
            <Grid>
                <TextBlock Text="Data on Tab 2" Name="txtData2"/>
            </Grid>
        </TabItem>
    </TabControl>
</Window>

これで、メインウィンドウからユーザーコントロールの内部ウィジェットにアクセスしたり、その逆を行ったりすることができます。ユーザーコントロールの名前の前にある「x:」に注意してください。

public partial class MainWindow : Window
{
    private void AccessWidgetWithinUserControl()
    {
        ucTab1Data.txtData1.Text = "New text on Tab 1";
    }
}

public partial class Tab1Data : UserControl
{
    private MainWindow mainWindow = null; // Reference to the MainWindow

    public Tab1Data()
    {
        InitializeComponent();
    }

    // get a reference to main windows when it is available.
    // The Loaded Event is set in the XAML code above.
    private void OnControlLoaded(object sender, RoutedEventArgs e)
    {
        mainWindow = Window.GetWindow(this) as MainWindow;
    }

    private void AccessMainWindowsWidget()
    {
        mainWindow.txtData2.Text = "New text on Tab 2 in the main window";
    }
}

txtData2にアクセスするために示されているコードは、独自のユーザーコントロールに埋め込まれている場合でも同じです。

于 2011-04-05T16:18:52.053 に答える
3

表面的には、これは別のリソース ファイルに格納できる TabItem コントロールのスタイルやテンプレートによって解決するのが最善のように思えます。実際の TabItem をどれだけカスタマイズする必要があるかによって、スタイルだけを使用できるか、テンプレートが必要かが決まります。

できることは、次のような MyResources.xaml を作成するように、別のリソース ファイルで各 TabItem の名前付きスタイルを定義することです。

<ResourceDictionary>
    <Style x:Key="MyTabItem" TargetType="{x:Type TabItem}">
      <!-- 
           you can just use simple property setters to set up 
           the TabItem or set the Template property to replace
           entire tab look and feel
      -->
    </Style>
</ResourceDictionary>

次に、メインの App.xaml ファイルで、リソース ディクショナリをマージします。

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MyResources.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

最後に、アプリケーションでこれらのスタイルを活用するには、次のようにします。

<TabItem Style="{DynamicResource MyTabItem}" />
于 2009-10-19T18:45:56.350 に答える
1

あなたが望んでいたのは、TabItem Content を個別に宣言することだと思います。TabItem は ContentControl であるため、UserControl をそのコンテンツとして提示できます。

<TabControl>
   <TabItem> 
       <local:YourTabContent1/>
   </TabItem>
   <TabItem> 
       <local:YourTabContent2/>
   </TabItem>
</TabControl>

別の XAML で:

<UserControl x:Class="MyProject.YourTabContent1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <......blah blah.../>
</UserControl>

別の XAML では、コンテンツ 2 を持つことができます

<UserControl x:Class="MyProject.YourTabContent2"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <......blah blah.../>
</UserControl>
于 2009-10-20T06:25:57.217 に答える