1

大家好!

xaml-markup对图片上显示的设计有疑问。如何将窗口按钮与选项卡项标题TAB1、、、?TAB2TAB3

http://dl.dropbox.com/u/59774606/so_question_pic.png

我对窗口按钮使用自定义控件,例如:

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

有谁知道我如何实现这一点?

4

2 回答 2

1

您可能必须删除窗口边框并自己绘制按钮。您必须自己处理按钮点击(不要忘记最大化在窗口最大化时也会恢复)并且还必须自己处理窗口拖动!

在此处输入图像描述

<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>

您可以看到连接到按钮的命令在窗口后面的代码中定义。

  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);
        }
}
于 2012-11-13T15:49:51.040 回答
0

微软有一个现已不复存在的项目,称为WPF Shell 集成库,它可以让您在 WPF 中绘制精美的玻璃窗口,并带有进入标题栏区域的选项卡。不幸的是,它不能完美地工作。

适用于 WPF SDK 的 Microsoft Ribbon 包含最新版本。这就是 RibbonWindow 能够将功能区合并到标题栏区域的方式,就像 Office 一样。

于 2012-11-13T17:45:32.050 回答