所以我发现这个回答的问题: Is it possible to rearrange tab items in tab control in wpf?
使用该线程中的信息,我在我的应用程序中设置了所有内容:
<TabControl x:Name="tabControl">
<TabControl.Resources>
<Style TargetType="TabItem">
<Setter Property="AllowDrop" Value="True"/>
<EventSetter Event="PreviewMouseMove" Handler="TabItem_Drag"/>
<EventSetter Event="Drop" Handler="TabItem_Drop"/>
</Style>
</TabControl.Resources>
</TabControl>
代码:
private void TabItem_Drag(object sender, MouseEventArgs e)
{
var tabItem = e.Source as TabItem;
if (tabItem == null)
return;
if (Mouse.PrimaryDevice.LeftButton == MouseButtonState.Pressed)
DragDrop.DoDragDrop(tabItem, tabItem, DragDropEffects.All);
}
private void TabItem_Drop(object sender, DragEventArgs e)
{
var tabItemTarget = e.Source as TabItem;
var tabItemSource = e.Data.GetData(typeof(TabItem)) as TabItem;
if (!tabItemTarget.Equals(tabItemSource))
{
int sourceIndex = tabControl.Items.IndexOf(tabItemSource);
int targetIndex = tabControl.Items.IndexOf(tabItemTarget);
tabControl.Items.Remove(tabItemSource);
tabControl.Items.Insert(targetIndex, tabItemSource);
tabControl.Items.Remove(tabItemTarget);
tabControl.Items.Insert(sourceIndex, tabItemTarget);
tabControl.SelectedIndex = targetIndex;
}
}
问题是,当我删除标签时,我在
处收到以下错误 if (!tabItemTarget.Equals(tabItemSource))
类型&#39; System.NullReferenceException&#39;的例外情况发生在Scoreboard Assistant.exe中但未在用户代码中处理
附加信息:未将对象引用设置为对象的实例。
当我点击“继续”时,我在
处收到以下错误消息 DragDrop.DoDragDrop(tabItem, tabItem, DragDropEffects.All);
未处理的类型&#39; System.NullReferenceException&#39;发生在PresentationCore.dll
附加信息:未将对象引用设置为对象的实例。
然后程序就死了。我做错了什么?
*编辑*
好的,我弄清楚问题是什么;我只是需要帮助修复它。如果选项卡项创建如下,则完全正常:
<TabItem Header="TabItem"/>
但是,我的标签创建如下:
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<Image Source="images/text.png" />
<TextBlock Text="Text"/>
</StackPanel>
</TabItem.Header>
</TabItem>
如您所见,我正在使用stackpanel在标签页眉中添加一个图标。问题似乎是当我拖放面板时,而不是将e.Source
作为tabitem读取,它会读取tabitem的stackpanel中的文本块。我该如何解决这个问题?
答案 0 :(得分:1)
由于TabItem
标题的可视树可能相当复杂,因此无法保证,放置目标将是TabItem
实例(这是代码中发生的情况)。
但你可以通过探索视觉树找到TabItem
:
private TabItem GetTargetTabItem(object originalSource)
{
var current = originalSource as DependencyObject;
while (current != null)
{
var tabItem = current as TabItem;
if (tabItem != null)
{
return tabItem;
}
current = VisualTreeHelper.GetParent(current);
}
return null;
}
private void TabItem_Drop(object sender, DragEventArgs e)
{
var tabItemTarget = GetTargetTabItem(e.OriginalSource);
if (tabItemTarget != null)
{
var tabItemSource = (TabItem)e.Data.GetData(typeof(TabItem));
if (tabItemTarget != tabItemSource)
{
// the rest of your code
}
}
}