- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想扩展选项卡控件以具有可关闭的选项卡项目。
我找到了 Kent 的这个 WPF 解决方案:
On the WPF TabControl - can I add content next to the tab headers?
我在 Blend 中打开了现有 Silverlight tabcontrol 的副本。然而,结构看起来与 WPF 选项卡控件完全不同。我无法将其直接放入 Silverlight 控件模板中。
有人知道我的好资源吗?
最佳答案
我之前也遇到过同样的问题,然后我决定使用扩展 TabControl
.我不知道在哪里找到它,但没关系,现在它在我的项目中。
有了这个 TabControl
我可以在 ViewModel 集合中添加或删除项目,我的更改将反射(reflect)在用户界面上。
MyTabControl.cs
public class MyTabControl : TabControl
{
public MyTabControl()
: base()
{
this.SelectionChanged += OnSelectionChanged;
}
#region Tabs with databinding and templates
/// <summary>
/// Template for a TabItem header
/// </summary>
public DataTemplate TabHeaderItemTemplate
{
get { return (DataTemplate)GetValue(TabHeaderItemTemplateProperty); }
set { SetValue(TabHeaderItemTemplateProperty, value); }
}
public static readonly DependencyProperty TabHeaderItemTemplateProperty =
DependencyProperty.Register("TabHeaderItemTemplate", typeof(DataTemplate), typeof(MyTabControl), new PropertyMetadata(
(sender, e) =>
{
((MyTabControl)sender).InitTabs();
}));
/// <summary>
/// Template for a content
/// </summary>
public DataTemplate TabItemTemplate
{
get { return (DataTemplate)GetValue(TabItemTemplateProperty); }
set { SetValue(TabItemTemplateProperty, value); }
}
public static readonly DependencyProperty TabItemTemplateProperty =
DependencyProperty.Register("TabItemTemplate", typeof(DataTemplate), typeof(MyTabControl), new PropertyMetadata(
(sender, e) =>
{
((MyTabControl)sender).InitTabs();
}));
/// <summary>
/// Source of clr-objects
/// </summary>
public IEnumerable MyItemsSource
{
get
{
return (IEnumerable)GetValue(MyItemsSourceProperty);
}
set
{
SetValue(MyItemsSourceProperty, value);
}
}
public static readonly DependencyProperty MyItemsSourceProperty =
DependencyProperty.Register("MyItemsSource", typeof(IEnumerable), typeof(MyTabControl), new PropertyMetadata(
(sender, e) =>
{
MyTabControl control = (MyTabControl)sender;
INotifyCollectionChanged incc = e.OldValue as INotifyCollectionChanged;
if (incc != null)
{
incc.CollectionChanged -= control.MyItemsSourceCollectionChanged;
}
control.InitTabs();
incc = e.NewValue as INotifyCollectionChanged;
if (incc != null)
{
incc.CollectionChanged += control.MyItemsSourceCollectionChanged;
}
}));
/// <summary>
/// Selected item as object
/// </summary>
public object MySelectedItem
{
get { return (object)GetValue(MySelectedItemProperty); }
set { SetValue(MySelectedItemProperty, value); }
}
// Using a DependencyProperty as the backing store for MySelectedItem. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MySelectedItemProperty =
DependencyProperty.Register("MySelectedItem", typeof(object), typeof(MyTabControl), new PropertyMetadata(
(sender, e) =>
{
MyTabControl control = (MyTabControl)sender;
if (e.NewValue == null)
control.SelectedItem = null;
else
{
var tab = control.Items.Cast<TabItem>().FirstOrDefault(ti => ti.DataContext == e.NewValue);
if (tab != null && control.SelectedItem != tab)
control.SelectedItem = tab;
}
}));
private void InitTabs()
{
Items.Clear();
if (MyItemsSource != null && MyItemsSource.OfType<object>().Any())
{
int i = 0;
foreach (var item in MyItemsSource)
{
var newitem = new TabItem();
if (TabItemTemplate != null)
newitem.Content = TabItemTemplate.LoadContent();
if (TabHeaderItemTemplate != null)
newitem.Header = TabHeaderItemTemplate.LoadContent();
newitem.DataContext = item;
Items.Add(newitem);
}
VisualStateManager.GoToState(this, "Normal", true);
}
else VisualStateManager.GoToState(this, "NoTabs", true);
}
private void MyItemsSourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
if (e.NewStartingIndex > -1)
{
foreach (var item in e.NewItems)
{
var newitem = new TabItem();
if (TabItemTemplate != null)
newitem.Content = TabItemTemplate.LoadContent();
if (TabHeaderItemTemplate != null)
newitem.Header = TabHeaderItemTemplate.LoadContent();
newitem.DataContext = item;
Items.Add(newitem);
}
}
}
else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
if (e.OldStartingIndex > -1)
{
var ti = (TabItem)this.Items[e.OldStartingIndex];
Items.RemoveAt(e.OldStartingIndex);
}
}
else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Replace)
{
Items.RemoveAt(e.OldStartingIndex);
var newitem = new TabItem();
if (TabItemTemplate != null)
newitem.Content = TabItemTemplate.LoadContent();
if (TabHeaderItemTemplate != null)
newitem.Header = TabHeaderItemTemplate.LoadContent();
newitem.DataContext = e.NewItems[0];
Items.Add(newitem);
Items.Insert(e.NewStartingIndex, newitem);
}
else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Reset)
{
InitTabs();
}
}
#endregion
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var si = e.AddedItems.Cast<TabItem>().FirstOrDefault();
if (si != null)
this.MySelectedItem = si.DataContext;
else this.MySelectedItem = null;
}
}
<my:MyTabControl MyItemsSource="{Binding Items}" MySelectedItem="{Binding SelectedITem}">
<my:MyTabControl.TabHeaderItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Title}" VerticalAlignment="Center"/>
<Button Content="X" Margin="3" Width="20" Height="20" Grid.Column="1"
Command="{Binding RequestCloseCommand}"/>
</Grid>
</DataTemplate>
</my:MyTabControl.TabHeaderItemTemplate>
<my:MyTabControl.TabItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding Content}"/>
</DataTemplate>
</my:MyTabControl.TabItemTemplate>
</my:MyTabControl>
MyItemsSource
和
MySelectedItem
, 因为这个
TabControl
使用对象,而不是
TabItem
.
public class MainViewModel
{
public MainViewModel()
{
this.Items = new ObservableCollection<TabItemViewModel>
{
new TabItemViewModel("Tab 1", OnItemRequestClose),
new TabItemViewModel("Tab item 2", OnItemRequestClose)
};
}
public ObservableCollection<TabItemViewModel> Items { get; set; }
public void OnItemRequestClose(TabItemViewModel item)
{
this.Items.Remove(item);
}
}
public class TabItemViewModel
{
public TabItemViewModel(string title, Action<TabItemViewModel> onClose)
{
this.Title = title;
this.RequestCloseCommand = new DelegateCommand(_ => onClose(this));
//Just a demontration
this.Content = "Test content "+title;
}
public string Title { get; set; }
public ICommand RequestCloseCommand { get; set; }
public object Content { get; set; }
}
关于银光 4 : Making Closeable Tabitems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4828661/
我正在构建一个 LOB 应用程序,它有一个主要部分和一个包含各种 TabItems 的 TabControl。点击保存的想法是突出显示任何错误的字段,并且错误的第一个字段获得焦点。 如果第一个也是唯一
我将 xaml 中 tabitem 的背景颜色设置为红色,但是当我运行它并将鼠标悬停在它上面或选择它时,它会变回默认的灰色外观。仅当选择其他选项卡时,它才会正确显示。我怎样才能让它一直保持红色。谢谢!
如何为 tabitem 标题和该 tabitem 的内容设置不同的字体? 最佳答案 就像 WPF 中的任何东西一样,有很多方法。在不知道你到底想做什么的情况下,这里有一个“例如”(我不建议使用这种字体
之前选择的tabitem和选择的tabitem的动画开始工作正常,然后就不能正常工作了。 在我看来,代码应该可以正常工作。我不知道为什么现在动画不正确。 主窗口.xaml:
我有一个 Silverlight 应用程序,它有一个带有多个 TabItem 的 TabControl。当用户选择选项卡项时,我想将焦点设置到该选项卡项中的特定控件。我该怎么做? 我尝试为 TabCo
我在 TabControl 上有一个相当奇怪的行为,它的 TabItems 都折叠了:第一个 TabItem 的内容仍然可见(但标题不是)。 TabControl 及其 TabItems 设置如下:
下面是我的代码,当按下按钮时,我将根据我的情况使用 item1.setcontrol 更改 item1 列表。复合不刷新,但是当我单击 Item2 选项卡并返回 Item1 选项卡时...列表更新取决
这个问题有没有什么好的解决办法。 我已经设置了 tabitem.visibility=hidden 但这个 tabitem 中的内容仍然可见。我想隐藏tabitems的所有内容。 我确实搜索了一个解决
例如,使用 WPF 在选项卡控件的最左上角定位三个 tabitem 和在最右上角定位一个 tabitem 的正确方法是什么? 我尝试通过更改边距将第四个 tabitem 向右移动,但这并没有产生好的结
我正在尝试设置 TabControl 的样式,并且已经完成了 75% 的设置,但是我在设置实际 TabItems 的样式时遇到了困难: 我想要实现的是删除默认的 ContentPresenter 以便
我有一个 TabControl,其中有许多 TabItems 绑定(bind)到一个 ViewModel,该 ViewModel 具有每个 TabItem 的可见性的属性。 所有 Tab
我有一个 NSTabViewController,它有两个 NSTabViewItem。我想禁用第二个选项卡。 class MainTabViewController: NSTabViewContro
在这里,我有一个使用 Prism 6 Toolkit 的功能性 CloseTabAction,如下所示: class CloseTabAction : TriggerAction { prot
我有一个动态创建选项卡的 WPF 应用程序,现在我希望每个选项卡项都必须包含扩展器和用户控件,并且在运行时为扩展器和用户控件设置数据上下文 strong>,所以如果我在Style中定义tabitem的
我有一个问题。在我的 WPF 应用程序中,如果我用鼠标中键按下一个 tabItem,这个 tabItem 应该关闭。就像在 FireFox 中一样。但是我尝试使用 MVVM 来执行此操作,并且我需要使
您好,我正在使用 TabControl 制作 session 系统,私有(private)聊天将在新的 TabItem 中。我正在使用此代码来介绍一个新成员私下聊天: TabItem ti = new
所以我得到了一个带有一些 Tabitems 和一些按钮的 TabControl。 当我按下这些按钮时,会改变 TabStrip 的位置。 一切正常。我现在要做的是, 当我按下按钮 Right90 将标
是否可以在 TabControl 的 TabItem 中打开另一个 Window? 我想这样做的原因是,如果我的 TabControl 中有 5 个 TabItem,我正在编写所有这些 TabItem
我有一个TabControl 控件 在后面的代码中,我向 TabControl 动态添加了一些选项卡,如下所示: foreach (Village vill in Villages) {
如何向 wpf tabitem 添加一个上下文菜单,该菜单仅在我单击 tabitem 标题而不是内容时出现? 我还需要在 .cs 中动态创建 tabitems,因此在 .xaml 中静态执行此操作将不
我是一名优秀的程序员,十分优秀!