大家好!
我xaml-markup
对图片上显示的设计有疑问。如何将窗口按钮与选项卡项标题TAB1
、、、?TAB2
TAB3
我对窗口按钮使用自定义控件,例如:
<Border>
<StackPanel Orientation="Horizontal">
... buttons ...
</StackPanel>
</Border>
有谁知道我如何实现这一点?
大家好!
我xaml-markup
对图片上显示的设计有疑问。如何将窗口按钮与选项卡项标题TAB1
、、、?TAB2
TAB3
我对窗口按钮使用自定义控件,例如:
<Border>
<StackPanel Orientation="Horizontal">
... buttons ...
</StackPanel>
</Border>
有谁知道我如何实现这一点?
您可能必须删除窗口边框并自己绘制按钮。您必须自己处理按钮点击(不要忘记最大化在窗口最大化时也会恢复)并且还必须自己处理窗口拖动!
<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);
}
}
微软有一个现已不复存在的项目,称为WPF Shell 集成库,它可以让您在 WPF 中绘制精美的玻璃窗口,并带有进入标题栏区域的选项卡。不幸的是,它不能完美地工作。
适用于 WPF SDK 的 Microsoft Ribbon 包含最新版本。这就是 RibbonWindow 能够将功能区合并到标题栏区域的方式,就像 Office 一样。