- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 WindowChrome 时( downloadable here ) 要自定义窗口的非客户区,一个自然的起点是制作一个外观和行为与标准标题栏相同的标题栏。这需要添加一个“假”应用程序图标和标题栏,因为显然 WindowChrome 禁用了这些功能(最小化、最大化和关闭按钮仍然有效。)
这是我目前所拥有的:
<Window x:Class="MyApp.MainWindow"
x:Name="MainWindowItself"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"
xmlns:local="clr-namespace:MyApp"
Title="My Application" Icon="App.ico" Height="350" Width="525">
<Window.Resources>
<Style TargetType="{x:Type local:MainWindow}">
<Setter Property="shell:WindowChrome.WindowChrome">
<Setter.Value>
<shell:WindowChrome />
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MainWindow}">
<Grid>
<Border Background="White" Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowNonClientFrameThickness}">
<ContentPresenter Content="{TemplateBinding Content}" />
</Border>
<TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}"
VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="32,8,0,0"/>
<Image x:Name="SystemMenuIcon" Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}"
VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(shell:WindowChrome.WindowChrome).ResizeBorderThickness}"
Width="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=SmallIconSize.Width}"
shell:WindowChrome.IsHitTestVisibleInChrome="True" MouseDown="SystemMenuIcon_MouseDown">
</Image>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<TextBlock Text="Client area content goes here"/>
</Grid>
</Window>
代码隐藏:
private void SystemMenuIcon_MouseDown(object sender, MouseButtonEventArgs e)
{
var offs = SystemParameters2.Current.WindowNonClientFrameThickness;
SystemCommands.ShowSystemMenu(this, new Point(Left + offs.Left, Top + offs.Top));
}
这非常接近工作。第一个问题是,在您单击应用程序图标并出现系统菜单后,如果您再次单击该菜单应该会消失——相反,该菜单只是重新绘制。此外,如果双击,则窗口应该关闭,但 Image 没有双击事件。您建议如何添加这些功能?
最佳答案
要禁用标准 Chrome 按钮的工作只需在 shell:WindowsChrome
CaptionHeight="0"
就这样吧
<Setter Property="shell:WindowChrome.WindowChrome">
<Setter.Value>
<shell:WindowChrome CaptionHeight="0" />
</Setter.Value>
</Setter>
做一个假的 Chrome。修改模板如下:
<ControlTemplate TargetType="Window">
<AdornerDecorator>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="35" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid x:Name="PART_Chrome" shell:WindowChrome.IsHitTestVisibleInChrome="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="105" />
</Grid.ColumnDefinitions>
<Image Source="Application Favicon Path" />
<TextBlock Grid.Column="1" Text="{TemplateBinding Title}" VerticalAlignment="Center" />
<StackPanel Orientation="Horizontal" Grid.Column="3" >
<Button Command="{Binding Source={x:Static shell:SystemCommands.MinimizeWindowCommand}}" >
<Path Data="M0,6 L8,6 Z" Width="8" Height="7" VerticalAlignment="Center" HorizontalAlignment="Center"
Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}" StrokeThickness="2" />
</Button>
<Button x:Name="MaximizeButton" Command="{Binding Source={x:Static shell:SystemCommands.MaximizeWindowCommand}}" >
<Path Data="M0,1 L9,1 L9,8 L0,8 Z" Width="9" Height="8" VerticalAlignment="Center" HorizontalAlignment="Center"
Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}" StrokeThickness="2" />
</Button>
<Button x:Name="RestoreButton" Command="{Binding Source={x:Static shell:SystemCommands.RestoreWindowCommand}}" >
<Path Data="M2,0 L8,0 L8,6 M0,3 L6,3 M0,2 L6,2 L6,8 L0,8 Z" Width="8" Height="8" VerticalAlignment="Center" HorizontalAlignment="Center"
Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}" StrokeThickness="1" />
</Button>
<Button Command="{Binding Source={x:Static shell:SystemCommands.CloseWindowCommand}}" >
<Path Data="M0,0 L8,7 M8,0 L0,7 Z" Width="8" Height="7" VerticalAlignment="Center" HorizontalAlignment="Center"
Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}" StrokeThickness="1.5" />
</Button>
</StackPanel>
</Grid>
<ContentPresenter Grid.Row="1" Content="{TemplateBinding Content}" />
</Grid>
</AdornerDecorator>
<ControlTemplate.Triggers>
<Trigger Property="WindowState" Value="Normal">
<Setter Property="Visibility" Value="Collapsed" TargetName="RestoreButton" />
<Setter Property="Visibility" Value="Visible" TargetName="MaximizeButton" />
</Trigger>
<Trigger Property="WindowState" Value="Maximized">
<Setter Property="Visibility" Value="Visible" TargetName="RestoreButton" />
<Setter Property="Visibility" Value="Collapsed" TargetName="MaximizeButton" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
也为 Fake Chrome bar 的正常工作做命令绑定(bind)
public MainWindow()
{
this.CommandBindings.Add(new CommandBinding(SystemCommands.CloseWindowCommand, OnCloseWindow));
this.CommandBindings.Add(new CommandBinding(SystemCommands.MaximizeWindowCommand, OnMaximizeWindow, OnCanResizeWindow));
this.CommandBindings.Add(new CommandBinding(SystemCommands.MinimizeWindowCommand, OnMinimizeWindow, OnCanMinimizeWindow));
this.CommandBindings.Add(new CommandBinding(SystemCommands.RestoreWindowCommand, OnRestoreWindow, OnCanResizeWindow));
}
private void OnCanMinimizeWindow(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = this.ResizeMode != ResizeMode.NoResize;
}
private void OnCanResizeWindow(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = this.ResizeMode == ResizeMode.CanResize || this.ResizeMode == ResizeMode.CanResizeWithGrip;
}
private void OnCloseWindow(object sender, ExecutedRoutedEventArgs e)
{
Microsoft.Windows.Shell.SystemCommands.CloseWindow(this);
}
private void OnMaximizeWindow(object sender, ExecutedRoutedEventArgs e)
{
Microsoft.Windows.Shell.SystemCommands.MaximizeWindow(this);
}
private void OnMinimizeWindow(object sender, ExecutedRoutedEventArgs e)
{
Microsoft.Windows.Shell.SystemCommands.MinimizeWindow(this);
}
private void OnRestoreWindow(object sender, ExecutedRoutedEventArgs e)
{
Microsoft.Windows.Shell.SystemCommands.RestoreWindow(this);
}
关于c# - 使用 WindowChrome 复制标准系统菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6131684/
我的 WPF 应用程序有一个自定义 WindowChrome 样式(从这里获取:http://www.bdevuyst.com/wpf-custom-title-bar-and-taskbar/)。
我正在设计一个 Window,但我注意到 WindowChrome 的这种奇怪行为(在 .NET FW 4.0 中,来自 external Microsoft.Windows.Shell dll)。
因为 WPF 没有允许显示多个月份的月历,所以我尝试在 WindowsFormsHost 中使用经典的 WindowsForms MonthCalendar。在“普通”WPF 窗口中执行此操作效果很好
使用 WindowChrome 时( downloadable here ) 要自定义窗口的非客户区,一个自然的起点是制作一个外观和行为与标准标题栏相同的标题栏。这需要添加一个“假”应用程序图标和标题
我正在使用 WindowChrome 以简单快速的方式重新设置窗口样式,但问题是在调整窗口大小时会出现闪烁,尤其是在从左向右调整大小时。
我已经在谷歌上搜索了很多,但找不到任何有效的解决方案。我使用 Shell 集成库来创建自定义 Window Chrome,我还需要该窗口的阴影。有人说将 GlassFrameThickness 设置为
我正在使用 WindowChrome 创建自定义 WPF 窗口。我定义了自己的样式,但标题栏出现问题。如果我将模板中的主要 Grid 的 Background 设置为 Transparent,则整个窗
我正在检查 System.Windows.Shell 库 (v 3.5.41019.1) 中的 WindowChrome 类。当我尝试创建 Window 模板时,模板中 Border 元素的边距似乎没
我发现在 WPF 窗口上使用 WindowChrome 可以让我把内容放在窗口中我想要的任何地方,这是一个很好的想法。现在我终于可以让标题栏与我的应用程序的其余部分具有相同的颜色。 但是,我仍然喜欢出
我使用 WindowChrome 自定义窗口。当我最大化窗口时,边缘超出了屏幕。我使用以下代码来解决此问题:
我在 Windows 8.1 上使用自己风格的 WPF 窗口存在一些问题。我用 WindowChrome 编写了一个简单的透明 WPF 窗口,用于默认窗口拖动行为:
我正在尝试使用 WindowChrome 类自定义窗口边框。没有 Windows Aero 玻璃效果。不出所料,我最终得到了一个黑人寄宿生。但我最终也没有字幕按钮 我从微软了解到,我可以通过将窗口样式
我是一名优秀的程序员,十分优秀!