WPF校准屏幕和标签控件

时间:2015-01-15 21:44:22

标签: c# wpf mvvm

目前我有工作标签,他们正确地打开和关闭。我正在尝试实现一个关闭所有功能和一个关闭所有但这个选项卡功能,我想知道我该怎么做?选项卡在我的ShellViewModel中初始化。

当前TabsView.xaml

<Style TargetType="{x:Type ListBoxItem}">
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="Template">
        <Setter.Value>
           <ControlTemplate TargetType="{x:Type ListBoxItem}">
                 <StackPanel Name="Panel" Background="#88DDDDDD" SnapsToDevicePixels="True" Orientation="Horizontal" Margin="1 0" cal:Message.Attach="[Event MouseDown] = [Action Show($dataContext)]">
                    <TextBlock Text="{Binding DisplayName}" VerticalAlignment="Center" TextAlignment="Right" FontWeight="Bold" >
                        <TextBlock.ContextMenu>
                                <ContextMenu>
                                <MenuItem Header="Close All Tabs" cal:Message.Attach="[Event Click] = [Action CloseTabs($this)]"/>
                                <MenuItem Header="Close All But This" cal:Message.Attach="[Event Click] = [Action CloseAllButThis]"/>

                            </ContextMenu>
                        </TextBlock.ContextMenu>
                    </TextBlock>
                    <Button Background="Transparent" cal:Message.Attach="[Click] = [Close($this)]" BorderThickness="0" VerticalAlignment="Center">
                        <ContentControl ContentTemplate="{StaticResource Icons.CloseButtonSmall}" Background="#900" Width="10" Height="10" Margin="3" VerticalAlignment="Center"/>
                    </Button>
                </StackPanel>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter TargetName="Panel" Property="Background" Value="#DDD"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="#093"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

TabsViewModel.cs

private readonly IEventAggregator _events;

public List<IScreen> Items { get; private set; } 

public WorkTabsViewModel(IEventAggregator events)
{
    _events = events;
    _events.Subscribe(this);
}

public void Close(IScreen tab)
{
    if (tab.DisplayName == "Settings")
    {
        var settingsViewModel = tab as SettingsViewModel;
        if (settingsViewModel != null)
        {
            tab.TryClose();
        }
    }
    else
    {
        tab.TryClose();
    }
}

public void Show(IScreen screen)
{
    _events.PublishOnUIThread(new ShowTabEvent(screen));
}

public void Handle(ScreenChangeEvent screenChangeEvent)
{
    Items = screenChangeEvent.Tabs.Where(x => Array.IndexOf(HiddenTabs, x.GetType().Name) < 0).ToList();
    NotifyOfPropertyChange(() => Items);
}

1 个答案:

答案 0 :(得分:2)

在ViewModel中,您可以执行以下操作:

public class WorkTabsViewModelpublic extends Conductor<IScreen>.Collection.OneActive
{
    // ....

    void CloseAll() {
        foreach (IScreen tab in Items)
        {
            tab.TryClose();
        }
    }

  // ....
}

然后在您的视图中,您可以添加一个按钮,在单击时调用该方法

<Button x:Name="CloseAll">Close All Tabs</Button>

只要您的ViewModel扩展了Conductor<IScreen>.Collection.OneActive(或类似的东西),这将遍历所有打开的标签页并尝试关闭它们。