这是我的代码:
public MainForm()
{
InitializeComponent();
MyServiceSettings obj = (MyServiceSettings)ConfigurationManager.GetSection("MyServiceSettings");
foreach (MyServiceConfigElement service in obj.Services)
CreateServiceControl(service);
}
private void CreateServiceControl(MyServiceConfigElement service)
{
TabPage tp = new TabPage(service.Name);
tabControl1.TabPages.Insert(0, tp);
//tabControl1.TabPages.Add(tp);
tabControl1.Refresh();
}
Run Code Online (Sandbox Code Playgroud)
简而言之,它读取配置文件中的一个部分,并为该部分中的每个元素创建一个选项卡.
我已经在设计时创建了一个静态TabPage.我希望在此静态选项卡之前插入动态创建的选项卡.
运行此代码时,tabcontrol仅显示静态标签页.
如果我做这个改变:
private void CreateServiceControl(SoftInfoServiceConfigElement service)
{
TabPage tp = new TabPage(service.Name);
//tabControl1.TabPages.Insert(1, tp);
tabControl1.TabPages.Add(tp);
tabControl1.Refresh();
}
Run Code Online (Sandbox Code Playgroud)
使用Add方法显示所有页面.但我没有得到我想要的订单.
使用Insert方法有什么我不理解的东西吗?它为什么工作?
在wpf中,我设置了一个标签控件,它绑定到一个对象集合,每个对象都有一个数据模板,数据网格显示数据.如果我选择一个特定的细胞,并把它进入编辑模式,转到另一个选项卡离开电网,这将导致异常下面要在返回数据网格抛出:
在AddNew或EditItem事务期间不允许"DeferRefresh".
看来该单元格从未离开编辑模式.是否有一种简单的方法可以将单元格从编辑模式中取出,或者是否还有其他功能?
更新:它看起来像如果我不绑定选项卡控件到数据源,而是明确定义每个选项卡,然后在数据源中的每个项目绑定到内容控制这个问题消失.这不是一个很好的解决方案,所以我仍然想知道如何将集合直接绑定到选项卡控件.
更新:所以我实际上为自己的解决方案所做的是使用ListView和内容控件来代替选项卡控件.我使用样式使列表视图看起来像.视图模型公开一组子视图模型,并允许用户通过列表视图选择一个.然后,内容控件呈现所选择的视图模型,并且每个视图模型具有包含数据网格的关联数据模板.通过此设置在视图模型之间切换,而在网格上的编辑模式下,将正确结束编辑模式并保存数据.
这是设置它的xaml:
<ListView ItemTemplate="{StaticResource MakeItemsLookLikeTabs}"
ItemsSource="{Binding ViewModels}"
SelectedItem="{Binding Selected}"
Style="{StaticResource MakeItLookLikeATabControl}"/>
<ContentControl Content="{Binding Selected}">
Run Code Online (Sandbox Code Playgroud)
我会接受Phil的答案,因为它也应该有效,但对我来说,上面的解决方案似乎在项目之间更容易移植.
我在MVVM WPF应用程序中有一个TabControl .它的定义如下.
<TabControl Style="{StaticResource PortfolioSelectionTabControl}" SelectedItem="{Binding SelectedParameterTab}" >
<TabItem Header="Trades" Style="{StaticResource PortfolioSelectionTabItem}">
<ContentControl Margin="0,10,0,5" Name="NSDetailTradeRegion" cal:RegionManager.RegionName="NSDetailTradeRegion" />
</TabItem>
<TabItem Header="Ccy Rates" Style="{StaticResource PortfolioSelectionTabItem}">
<ContentControl Margin="0,10,0,5" Name="NSDetailCcyRegion" cal:RegionManager.RegionName="NSDetailCcyRegion" />
</TabItem>
<TabItem Header="Correlations / Shocks" Style="{StaticResource PortfolioSelectionTabItem}">
<ContentControl Name="NSDetailCorrelationRegion" cal:RegionManager.RegionName="NSDetailCorrelationRegion" />
</TabItem>
<TabItem Header="Facility Overrides" Style="{StaticResource PortfolioSelectionTabItem}" IsEnabled="False">
<ContentControl Name="NSDetailFacilityOverrides" cal:RegionManager.RegionName="NSDetailFacilityOverrides" />
</TabItem>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
因此,每个标签项内容都有自己的视图与之关联.这些视图中的每一个都具有MEF [Export]属性,并通过视图发现与相关区域相关联,因此上面的代码就是我需要让标签控件加载并在它们之间切换.它们都引用了它们后面的相同共享ViewModel对象,因此所有对象都无缝地交互.
我的问题是,当用户导航到父窗口时,我希望选项卡控件默认为第二个选项卡项.通过IsSelected="True"在TabItem编号2 中的XAML 中指定,在首次加载窗口时这很容易做到.当用户离开屏幕然后返回到屏幕时,这样做不太容易.
我想SelectedItem={Binding SelectedTabItem}在tab控件上有一个属性,所以我可以在ViewModel中以编程方式设置所选的选项卡,但问题是我不知道ViewModel中的TabItem对象,因为它们仅在XAML中声明,所以我没有TabItem对象传递给setter属性.
我有一个想法是让子视图(形成上面每个标签项的内容)在他们的XAML的UserControl级别上有一个样式,如下所示.
<Style TargetType={x:Type UserControl}>
<Style.Triggers>
<DataTrigger Property="IsSelected" Value="True">
<Setter Property="{ElementName={FindAncestor, Parent, typeof(TabItem)}, …Run Code Online (Sandbox Code Playgroud) 我正在使用C#中的winforms应用程序,它在tabcontrol的主页面内有一个按钮,每次单击它时都会生成另一个tabpage.每个新标签页都将包含由用户控件定义的布局.
如何允许用户关闭在运行时动态创建的其中一个选项卡?
我如何修改tabcontrol本身,以便在每个标签中都有一个小的"X",用户可以点击该标签以关闭该特定标签?(像Firefox一样)
如果我想用用户控件中的按钮关闭选项卡,我怎样才能将tabcontrol的SelectedIndex属性公开给用户控件呢?
当WPF选项卡控件中的选项卡更改时,有没有办法阻止选项卡卸载/重新加载?或者,如果不可能,是否有建议的方法来缓存选项卡内容,以便不必在每次更改选项卡时重新生成它们?
例如,一个选项卡的UI可完全自定义并存储在数据库中.当用户选择要处理的对象时,自定义布局中的项目将填充该对象的数据.用户期望初始加载或检索数据时会有轻微延迟,但在选项卡之间来回切换时则不会,并且更改选项卡时的延迟非常明显.
我需要更改TabControl标题的背景颜色,但TabControl没有它的属性,我该怎么做.请帮帮我.这是我的代码:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="502" Width="628">
<TabControl Background="#123" TabStripPlacement="Left" HorizontalAlignment="Stretch" BorderBrush="#41020202">
<TabControl.BitmapEffect>
<DropShadowBitmapEffect Color="Black" Direction="270"/>
</TabControl.BitmapEffect>
<TabControl.Resources>
<Style TargetType="{x:Type TabItem}">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="0" />
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Border x:Name="grid" Background="Red">
<ContentPresenter>
<ContentPresenter.Content>
<TextBlock Margin="4" FontSize="15" Text="{TemplateBinding Content}"/>
</ContentPresenter.Content>
<ContentPresenter.LayoutTransform>
<RotateTransform Angle="270" />
</ContentPresenter.LayoutTransform>
</ContentPresenter>
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TabItem}},Path=IsSelected}" Value="True">
<Setter TargetName="grid" Property="Background" Value="Green"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.Resources>
<TabItem Header="Tab Item 1" />
<TabItem Header="Tab Item 2" />
<TabItem …Run Code Online (Sandbox Code Playgroud) 我怎么能TabPage在TabControl可见/隐藏和启用/禁用?
如何告诉我的TabControl将焦点设置为其第一个TabItem,如下所示:
伪代码:
((TabItem)(MainTabControl.Children[0])).SetFocus();
Run Code Online (Sandbox Code Playgroud) 如何在设计过程中重新排序TabPages?
在我的一个项目中,我并不是要实现运行时重新排序,但是我想在最初以另一个顺序设计它们之后将页面放在一个特定的有意义的顺序中.