【问题标题】:C# WPF Window Not Shown Correctly After Restore还原后 C# WPF 窗口未正确显示
【发布时间】:2018-01-13 11:40:16
【问题描述】:

我有一个非常通用的 WPF 窗口,它开始最大化。当这个窗口最小化到任务栏,然后恢复窗口不再填满屏幕。它在右侧显示了桌面的一小部分。 Windows 仍然认为它已最大化,当设置为正常然后再次最大化时,它看起来应该是这样,直到再次最小化。

    public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
        this.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth;
    }

    private void ExitBtn_Click(object sender, MouseButtonEventArgs e)
    {
        this.Close();
    }
    private void MaxBtn_Click(object sender, MouseButtonEventArgs e)
    {
        this.WindowState = WindowState.Maximized;
        //Application.Current.MainWindow.WindowState = WindowState.Maximized;
        resizeBtn.Visibility = Visibility.Visible;
        maximizeBtn.Visibility = Visibility.Hidden;
    }
    private void ResBtn_Click(object sender, MouseButtonEventArgs e)
    {
        this.WindowState = WindowState.Normal;
        resizeBtn.Visibility = Visibility.Hidden;
        maximizeBtn.Visibility = Visibility.Visible;
    }
    private void MinBtn_Click(object sender, MouseButtonEventArgs e)
    {
        this.WindowState = WindowState.Minimized;
    }
    private void TitleBar_DblClick(object sender, MouseButtonEventArgs e)
    {
        if (this.WindowState == WindowState.Normal){ this.WindowState = WindowState.Maximized; return; }
        if (this.WindowState == WindowState.Maximized) { this.WindowState = WindowState.Normal; return; }
    }
}

你的想法? 更新:

似乎与 can resize 属性有关。如果我将它设置为 ca 最小化就可以了。使用夹子调整大小或可以调整大小导致窗口在最小化到任务栏后改变大小。

<Window x:Class="QuoteClient.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:QuoteClient"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525" WindowStyle="None" Background="Black" BorderBrush="Black">
<Grid>
    <local:TitleBar VerticalAlignment="Top" MouseDoubleClick="TitleBar_DblClick"/>
    <local:ExitBtn x:Name="exitBtn" Margin="0,2.5,2.5,0" Height="15" VerticalAlignment="Top" HorizontalAlignment="Right" Width="15" MouseLeftButtonUp="ExitBtn_Click"/>
    <local:MinBtn x:Name="minimizeBtn" Margin="0,2,37,0" HorizontalAlignment="Right" Width="15" Height="15" VerticalAlignment="Top" MouseLeftButtonUp="MinBtn_Click"/>
    <local:MaxBtn x:Name="maximizeBtn" Margin="0,2,20,0" HorizontalAlignment="Right" Width="13" Height="15" VerticalAlignment="Top" MouseLeftButtonUp="MaxBtn_Click"/>
    <local:ResBtn x:Name="resizeBtn" Margin="0,2,20,0" HorizontalAlignment="Right" Width="15" Height="15" VerticalAlignment="Top"  Visibility="Hidden" MouseLeftButtonUp="ResBtn_Click"/>
    <DataGrid Margin="10,25,10,10" Background="Black" BorderBrush="{x:Null}" HorizontalGridLinesBrush="White" VerticalGridLinesBrush="White" AlternatingRowBackground="#FF575656" RowBackground="#FF403C3C" Cursor="Cross"/>
    <Expander Header="Menu" HorizontalAlignment="Left" Margin="-5,-17,0,0" Width="100" FontSize="10" RenderTransformOrigin="0.5,0.5" Height="332" VerticalAlignment="Top" BorderBrush="White" Background="Black" Foreground="#FFFFFEFE">
        <Expander.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleY="0.9" ScaleX="0.9"/>
                <SkewTransform/>
                <RotateTransform/>
                <TranslateTransform/>
            </TransformGroup>
        </Expander.RenderTransform>
    </Expander>


</Grid>

更新 2: 截图:https://ibb.co/iN2n7F 答案截图:https://ibb.co/c3BHra

回答:问题仅与我的显示器有关。还没有弄清楚,但该程序在另一台 PC 上按预期运行。非常感谢@Vanna 帮助我解析了这一点。

【问题讨论】:

  • 我编辑了我的帖子。 MaxBtn 和 ResBtn 是尝试其他东西的剩余物。设置最大高度和宽度是一个修复,因此 WPF 窗口没有隐藏任务栏。使用您的代码,窗口仍然隐藏任务栏。

标签: c# wpf resize


【解决方案1】:

编辑
这段代码已经过测试

MainWindow.xml

<Window x:Class="QuoteClient.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"    
    xmlns:local="clr-namespace:QuoteClient"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525" WindowStyle="None" ResizeMode="CanResize" WindowStartupLocation="CenterScreen" MouseDown="Window_MouseDown" MouseDoubleClick="Window_MouseDoubleClick">

<StackPanel Orientation="Horizontal" Margin="0" VerticalAlignment="Top" FlowDirection="RightToLeft">
    <Button x:Name="ExitBtn" Content="Exit" Width="75" Click="ExitApplication" />
    <Button x:Name="MaximizeBtn" Content="max" Width="75" Click="MaximizeState"/>
    <Button x:Name="NormalBtn" Content="normal" Width="75" Click="NormalState" Visibility="Collapsed"/>
    <Button x:Name="MinimizeBtn" Content="min" Width="75" Click="MinimizeState"/>
</StackPanel>
</Window>

MainWindow.cs

private static bool _isPrivStateMinimized;
private static int _left, _top;

public MainWindow()
{
    InitializeComponent();
    MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
    MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth;
}

protected override void OnStateChanged(EventArgs e)
{            
    base.OnStateChanged(e);
    if (WindowState == WindowState.Minimized)
    {
        _isPrivStateMinimized = true;
        return;
    }
    if (_isPrivStateMinimized)
    {
        if(WindowState == WindowState.Maximized)
        {
            _left = Left;
            Left = 0;
            _top = Top;
            Top = 0;
        }
        else
        {
            Left = _left;
            Top = _top;
        }
    }
    _isPrivStateMinimized = false;
    BringIntoView();
}

private void MaximizeState(object sender, RoutedEventArgs e)
{
    WindowState = WindowState.Maximized;
    MaximizeBtn.Visibility = Visibility.Collapsed;
    NormalBtn.Visibility = Visibility.Visible;
}

private void NormalState(object sender, RoutedEventArgs e)
{
    WindowState = WindowState.Normal;
    NormalBtn.Visibility = Visibility.Collapsed;
    MaximizeBtn.Visibility = Visibility.Visible;
}

private void MinimizeState(object sender, RoutedEventArgs e)
{
    WindowState = WindowState.Minimized;
}

private void ExitApplication(object sender, RoutedEventArgs e)
{
    Close();
}

private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.ChangedButton == MouseButton.Left)
        DragMove();
}

private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    if (WindowState == WindowState.Maximized)
    {
        WindowState = WindowState.Normal;
        NormalBtn.Visibility = Visibility.Collapsed;
        MaximizeBtn.Visibility = Visibility.Visible;
        return;
    }
    WindowState = WindowState.Maximized;
    MaximizeBtn.Visibility = Visibility.Collapsed;
    NormalBtn.Visibility = Visibility.Visible;
}

【讨论】:

  • 好的。窗口样式是无。在第一次加载它是正常的中心屏幕,然后可以通过双击标题栏或按钮最大化。就像我之前说的,它与调整大小模式有关。如果设置为NoResizeCanMinimize 则没有问题。但我希望窗口可以调整大小
  • 所以即使您的代码被复制和粘贴,它仍然会发生。我想我的特定环境有问题...
  • 是的全新解决方案。当然必须更改名称空间等以匹配。不,我不希望它隐藏任务栏。我会把屏幕截图放在原帖中
  • 添加了指向您和我的帖子的链接。
猜你喜欢
  • 2013-04-02
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
相关资源
最近更新 更多