0

私は次のコードを持っています:

    private Dictionary<int, UserControl> tabControls = new Dictionary<int, UserControl>();

    public MainWindow()
    {
        InitializeComponent();

        tabControls[0] = new Panel1();
        tabControls[1] = new Panel2();
        tabControls[2] = new Panel3();
        tabControls[3] = new Panel4();
        tabControls[4] = new Panel5();
        tabControls[5] = new Panel6();
        tabControls[6] = new Panel7();
        tabControls[7] = new Panel8();
    }

    public object SelectedTab
    {
        //this is assigned from xaml binding
        set
        {
            OnCurrentTabChanged(tabControl.SelectedIndex);
        }
    }


    void OnCurrentTabChanged(int tabIndex)
    {
        if (dataDisplay != null)
        {
            dataDisplay.Children.Clear();
            dataDisplay.Children.Add(tabControls[tabIndex]);
        }
    }

ユーザーが別のタブを選択するたびに、別のコントロールが表示されます。

xaml を使用してこれを簡素化する方法はありますか?

コントロール自体をタブ コントロール内に配置できません

4

3 に答える 3

2

TabControlヘッダーとフレームが非表示になっている別の方法でこれを行ったことがあります。SelectedIndex次に、を他のタブのにバインドするだけSelectedIndexで、2 つが同期されます

<!-- TabControl without the TabHeaders -->
<Style x:Key="TabControl_NoHeadersStyle" TargetType="{x:Type TabControl}">
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TabControl}">
                <DockPanel>
                    <!-- This is needed to draw TabControls with Bound items -->
                    <StackPanel IsItemsHost="True" Height="0" Width="0" />

                    <ContentPresenter x:Name="PART_SelectedContentHost"
                                      ContentSource="SelectedContent" />
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

次に、それぞれが異なるソースにバインドされた 2 つのタブ コントロールをセットアップし、SelectedIndex一方を他方にSelectedIndexバインドできます。

<TabControl x:Name="MainTabControl" />

<TabControl ItemsSource="{Binding Panels}"
            SelectedIndex="{Binding ElementName=MainTabControl, Path=SelectedIndex}" 
            Style="{StaticResource TabControl_NoHeadersStyle}" />

もう 1 つの方法はSelectedIndex、コード ビハインド内の何かに をバインドし、それが変更されるたびに、PropertyChanged表示するパネルを公開する別のプロパティで通知を発生させることです。

<TabControl SelectedIndex="{Binding SelectedTabIndex} />

<ContentControl Content="{Binding SelectedPanel}" />

そしてコードビハインドで

public int SelectedTabIndex
{
    get { return _selectedTabIndex;}
    set
    {
        if (_selectedTabIndex != value)
        {
            _selectedTabIndex = value;
            RaisePropertyChanged("SelectedTabIndex");

            RaisePropertyChanged("SelectedPanel");
        }
    }
}

public UserControl SelectedPanel
{
    get { return tabControls[SelectedTabIndex]; }
}
于 2012-04-12T13:45:47.323 に答える
1

TabItem には、バインドできる IsSelected プロパティがあり、構文が簡素化されると思います。

 public bool TabIsSelected
 {
     get { return tabIsSelected; }
     set 
     {
          if (value && dataDisplay != null)
          {
              dataDisplay.Children.Clear();
              dataDisplay.Children.Add(tabControls[tabIndex]);
          }
          tabIsSelected = value;
     }

しかし、コントロールをタブアイテムに配置できない理由はまだわかりませんか?

于 2012-04-12T13:46:04.840 に答える
0

コードビハインドの使用

void OnCurrentTabChanged(int tabIndex)
{
    if (dataDisplay != null)
    {
        UIElemnt[] pp = dataDisplay.Children.Cast<UIElement>().ToArray();
        Array.ForEach(pp, x=> x.visibility = Visibility.Collapsed); 
        pp[tabIndex].visibility = Visibility.Visible;
    }
}
于 2012-04-12T13:11:18.053 に答える