Xaml TabControl in the top of window

烈酒焚心 提交于 2020-01-14 04:53:22

问题


Hi All!

I have a trouble with xaml-markup design that is shown on a picture. How to place window buttons in one line with tab item headers TAB1, TAB2, TAB3?

I use custom control for window buttons like:

<Border>
    <StackPanel Orientation="Horizontal">
        ... buttons ...
    </StackPanel>
</Border>

Does anyone have ideas how I can implement this?


回答1:


You will probably have to remove the window border and draw the buttons yourself. You'll have to handle button clicks yourself (don't forget that maximize is also restore when the window is maximized) and also handle window dragging yourself too!

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"  
        Title="" WindowStyle="None" AllowsTransparency="True" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}"        
        >
    <Grid>
        <Grid Background="Silver">
            <TabControl>
                <TabItem Header="Tab 1"/>
                <TabItem Header="Tab 2"/>
                <TabItem Header="Tab 3"/>                
            </TabControl>
        </Grid>
        <StackPanel HorizontalAlignment="Right" VerticalAlignment="Top" Orientation="Horizontal" >
            <Button Content="_" Width="30" Command="{Binding MinimizeCommand}"/>
            <Button Content="-" Width="30" Command="{Binding MaximizeCommand}" />
            <Button Content="x" Width="30" Command="{Binding CloseCommand}"/>
        </StackPanel>        
    </Grid>
</Window>

The commands that you can see hooked up to the buttons are defined in code behind in the window.

  public partial class MainWindow : Window
    {
        public ICommand CloseCommand
        {
            get { return (ICommand)GetValue(CloseCommandProperty); }
            set { SetValue(CloseCommandProperty, value); }
        }
        public ICommand MinimizeCommand
        {
            get { return (ICommand)GetValue(MinimizeCommandProperty); }
            set { SetValue(MinimizeCommandProperty, value); }
        }
        public ICommand MaximizeCommand
        {
            get { return (ICommand)GetValue(MaximizeCommandProperty); }
            set { SetValue(MaximizeCommandProperty, value); }
        }

        public static readonly DependencyProperty CloseCommandProperty = DependencyProperty.Register("CloseCommand", typeof(ICommand), typeof(MainWindow), new PropertyMetadata(null));
        public static readonly DependencyProperty MinimizeCommandProperty = DependencyProperty.Register("MinimizeCommand", typeof(ICommand), typeof(MainWindow), new PropertyMetadata(null));
        public static readonly DependencyProperty MaximizeCommandProperty = DependencyProperty.Register("MaximizeCommand", typeof(ICommand), typeof(MainWindow), new PropertyMetadata(null));

        public MainWindow()
        {
            InitializeComponent();
            System.Windows.Interactivity.EventObserver a;


            // Setup the commands.
            CloseCommand = new RoutedCommand("CloseCommand", typeof(MainWindow));
            MinimizeCommand = new RoutedCommand("MinimizeCommand", typeof(MainWindow));
            MaximizeCommand = new RoutedCommand("MaximizeCommand", typeof(MainWindow));

            // Put them in the windows command bindings.
            this.CommandBindings.Add(new CommandBinding(CloseCommand, new ExecutedRoutedEventHandler((s, e) => this.Close()), new CanExecuteRoutedEventHandler((s, e) => { e.CanExecute = true; })));
            this.CommandBindings.Add(new CommandBinding(MinimizeCommand, new ExecutedRoutedEventHandler((s, e) => this.WindowState = System.Windows.WindowState.Minimized), new CanExecuteRoutedEventHandler((s, e) => { e.CanExecute = true; })));
            this.CommandBindings.Add(new CommandBinding(MaximizeCommand, new ExecutedRoutedEventHandler((s, e) => this.WindowState = System.Windows.WindowState.Maximized), new CanExecuteRoutedEventHandler((s, e) => { e.CanExecute = true; })));
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
                DragMove();

            base.OnMouseMove(e);
        }
}



回答2:


There is a now defunct project from Microsoft called the WPF Shell Integration library, which lets you draw fancy glass windows in WPF, with tabs that go into the title bar area. Unfortunately, it doesn't work perfectly.

The Microsoft Ribbon for WPF SDK has the most up to date version included in it. This is how the RibbonWindow is able to merge the ribbon into the title bar area, like Office does.



来源:https://stackoverflow.com/questions/13359518/xaml-tabcontrol-in-the-top-of-window

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!