非堆叠ItemsControl

时间:2014-03-26 20:40:27

标签: wpf wpf-controls

可能有更好的方法可以做到这一点,但这里有:我对用户工作流程的每一步都有一个用户控件。我正在使用Microsoft Prism和依赖注入。我有一个绑定到List的ItemsControl。每当用户执行需要下一个“步骤”的操作时,我都会将用户控件添加到ItemsControl绑定到的列表中。

当然,用户从上到下控制堆叠在彼此之上。我想要的是让最后一个绘制在每个其他人之上。这样当用户完成此步骤并点击“确定”时,我只需删除用户控件,就会自动显示上一步。

1 个答案:

答案 0 :(得分:0)

我按照HighCore的想法创建了一个制表符控件。

 <TabControl Name="MIPTabs" ItemsSource="{Binding UCList}"  HorizontalAlignment="Left"  VerticalAlignment="Top" Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Height}"  Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Width}">

UCList中的每个项目都是UserControl,其内容会自动添加到每个新标签中。然后我隐藏了标签:

 <TabControl.Resources>
            <Style TargetType="TabItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="TabItem">
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
 </TabControl.Resources>

然后我使用以下代码,以便每次添加选项卡时,它会将所选选项卡设置为等于最新选项卡:

 public MIP(IMIPVM viewModel) : this()
    {                

        this.DataContext = viewModel;


        var dpd = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(TabControl));
        if (dpd != null)
        {
            dpd.AddValueChanged(MIPTabs, UpdateTabs);


        }
    }


    private void UpdateTabs(object sender, EventArgs e)
    { 
        var view = CollectionViewSource.GetDefaultView(MIPTabs.ItemsSource);
        view.CollectionChanged += (o, f) =>
        {
            //This makes it so the last item ADDED is always the tab that is being displayed 
            MIPTabs.SelectedIndex = MIPTabs.Items.Count-1;
        };

    }