如何创建一个带有默认标题栏功能的透明WPF窗口?

5
我正在使用WPF编写一个小应用程序。我希望使窗口内部透明,具有不透明的控件,同时标题栏(以及移动、最小化、最大化、调整大小、关闭等功能)保持实体。
但由于某种原因,当将AllowTransparency设置为true时,WPF不允许我使用默认的标题栏,强制我将WindowStyle设置为None,这不是我想要的。是否有解决方法?
我的应用程序和问题并不那么复杂,从头开始也不是问题。
2个回答

5
为了实现窗口透明效果,您需要设置以下内容:
WindowStartupLocation="CenterScreen"
AllowsTransparency ="True"
WindowStyle="None"
Background="Transparent"

通过自己可以实现最大化、最小化和关闭:

XAML:

  <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30"></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <Rectangle Fill="Brown" MouseLeftButtonDown="Rectangle_MouseLeftButtonDown"></Rectangle>
    <WrapPanel HorizontalAlignment="Right" VerticalAlignment="Top" Height="30" Width="Auto">
        <Button Width="20" Height="20" Margin="5" Click="Button_Click_1">_</Button>
        <Button Width="20" Height="20" Margin="5" Click="Button_Click_2">口</Button>
        <Button Width="20" Height="20" Margin="5" Click="Button_Click_3">X</Button>
    </WrapPanel>
</Grid>

代码:

    /// <summary>
    /// Min
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        if (this.WindowState != WindowState.Minimized)
        {
            this.WindowState = WindowState.Minimized;
        }
    }

    /// <summary>
    /// Max
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        if (this.WindowState != WindowState.Maximized)
        {
            this.WindowState = WindowState.Normal;
        }
    }

    /// <summary>
    /// Close
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button_Click_3(object sender, RoutedEventArgs e)
    {
        this.Close();
    }

    /// <summary>
    /// DragMove
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Rectangle_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        this.DragMove();
    }

这并不具备所有窗口的功能。例如,当最大化时,拖动窗口标题栏不会取消最大化状态(使其变为正常状态)。双击标题栏也不能实现最大化/还原。 - Vladimir Vasilev

0

这是一个改进版的最大化代码

private void Button_Click_2(object sender, RoutedEventArgs e)
{
  if (this.WindowState != WindowState.Maximized)
  {
    this.WindowState = WindowState.Maximized;
  } else if(this.WindowState != WindowState.Normal)
  {
    this.WindowState = WindowState.Normal;
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接