Xaml 自定义选项卡项:可关闭选项卡并在关闭时释放内存
自定义选项卡项 我的ViewModel绑定了一个TabControl,我也想删除选项卡,但如果没有更改,我看不到选项卡项的默认值Xaml 自定义选项卡项:可关闭选项卡并在关闭时释放内存,xaml,mvvm,Xaml,Mvvm,自定义选项卡项 我的ViewModel绑定了一个TabControl,我也想删除选项卡,但如果没有更改,我看不到选项卡项的默认值 <TabControl Margin="5 5 5 0" Grid.Row="1" ItemsSource="{Binding Path=ListTabItem}" SelectedIndex="{Binding Path=CurrentTabItemIndex}" x:Na
<TabControl
Margin="5 5 5 0"
Grid.Row="1"
ItemsSource="{Binding Path=ListTabItem}"
SelectedIndex="{Binding Path=CurrentTabItemIndex}"
x:Name="Workspace" Background="White">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand
Command="{Binding ChangeTabCommand}"
CommandParameter="{Binding SelectedItem, ElementName=Workspace}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<!--Here is my tabHeader-->
<TabControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Header}" />
<Button Content="X" Command={Binding CloseTabCommand}
CommandParameter="{Binding SelectedItem, ElementName=Workspace}"/>
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
编辑:
我有一种工作方式,但我在关闭选项卡时遇到了问题,无法释放内存:
<Style x:Key="HeaderTabItem" TargetType="TabItem">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button
Width="20"
Height="20"
Margin="-3 0 5 0"
Padding="2"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{x:Null}" Background="{x:Null}" Foreground="{x:Null}"
DataContext="{Binding DataContext, ElementName=Workspace}"
Command="{Binding Path=CloseTabCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=TabItem, AncestorLevel=1}}" Content="X"/>
<ContentControl
Grid.Column="1"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Content="{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType=TabItem, AncestorLevel=1}}" />
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
在我的ViewModel中
CloseTabCommand = new RelayCommand<TabItem>(tab =>
{
if (null == tab) return;
ListTabItem.Remove(tab);
},
tab =>
{
return ListTabItem.IndexOf(tab) == CurrentTabItemIndex;
});
CloseTabCommand=newrelaycommand(tab=>
{
if(null==tab)返回;
ListTabItem.Remove(选项卡);
},
选项卡=>
{
返回ListTabItem.IndexOf(tab)=CurrentTabItemIndex;
});
有什么想法吗?WPF控件倾向于不适当地处理自己,除非它们的DataContext被清除(这似乎是一种黑客行为)。试试这个:
CloseTabCommand = new RelayCommand<TabItem>(tab =>
{
if (null == tab) return;
tab.DataContext = null;
ListTabItem.Remove(tab);
},
tab =>
{
return ListTabItem.IndexOf(tab) == CurrentTabItemIndex;
});
CloseTabCommand=newrelaycommand(tab=>
{
if(null==tab)返回;
tab.DataContext=null;
ListTabItem.Remove(选项卡);
},
选项卡=>
{
返回ListTabItem.IndexOf(tab)=CurrentTabItemIndex;
});
此外,请记住,您可能不会看到内存立即释放。由于垃圾收集在.NET中的工作方式,您的应用程序可能需要等待/其他事件,以便实际发生垃圾收集并清除内存
如果你真的想调用GC.Collect(),但是如果你不相信内存正在被释放,我会这样做,并且我只会把它放进去调试并确保对象被释放。确认后,将其移除,并让垃圾收集器执行其工作