最大化窗口后如何恢复圆角?

问题描述 投票:0回答:1

我使用的是 WindowStyle None,我的导航栏是一个矩形,正常 WindowState 的 RadiusX 和 RadiusY 设置为 16,我希望在窗口最大化时它们为 0。

当我最大化时,我确实设法将它们变为 0,但是当之后恢复正常时,它们不会变回来。

这是我尝试过的:

  1. 最大化至正常
            if (WindowState == WindowState.Maximized)
                
            {
                WindowState = WindowState.Normal;
                NavBar.RadiusX = 16;
                NavBar.RadiusY = 16;
            }

            else
                WindowState = WindowState.Maximized;
                NavBar.RadiusX = 0;
                NavBar.RadiusY = 0;
  1. 正常到最大化(角落保持圆形)
            if (WindowState == WindowState.Normal)
                
            {
                WindowState = WindowState.Maximized;
                NavBar.RadiusX = 0;
                NavBar.RadiusY = 0;
            }

            else
                WindowState = WindowState.Normal;
                NavBar.RadiusX = 16;
                NavBar.RadiusY = 16;

还复制导航栏矩形,更改半径并将其设置为隐藏在 XAML 中,并尝试在 C# 中切换可见性,如下所示:

            if (WindowState == WindowState.Maximized)
                
            {
                WindowState = WindowState.Normal;
                NavBarM.Visibility = Visibility.Hidden;
            }

            else
                WindowState = WindowState.Maximized;
                NavBarM.Visibility = Visibility.Visible;

这给了我与第一个相同的结果。

c# wpf xaml
1个回答
0
投票

我们可以关闭这个问题吗?您已经收到了正确的评论,帮助您处理您的

if
块。我将添加一些完全不同的内容:这里的兴趣不是触及任何代码隐藏、视图模型,并且根本没有代码。毕竟,您想要的只是装饰细节。用它们污染代码可不太好。

让我们尝试用纯 XAML 来实现它:

    <Window x:Class="SA.View.WindowMain"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WindowMain" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Border BorderBrush="Black" BorderThickness="1"
                Padding="10 4 10 4">
            <TextBlock>Command bar</TextBlock>
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <DataTrigger
                            Binding="{Binding WindowState,
                            RelativeSource=
                            {RelativeSource AncestorType=Window}}"
                            Value="Maximized">
                                <Setter Property="CornerRadius" Value="0"/>
                                <Setter Property="Margin" Value="0 0 0 4"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding WindowState,
                            RelativeSource=
                            {RelativeSource AncestorType=Window}}"
                            Value="Normal">
                                <Setter Property="CornerRadius" Value="9"/>
                                <Setter Property="Margin" Value="8 4 8 4"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>
    </Grid>
</Window>

这里,

RelativeSource
绑定用于处理来自其类型识别的父级
Window
的属性更改事件。我还在两个数据触发器中添加了另一个
Setter
来更改条形边框边距,使其在角变圆时看起来更好。

我希望您不想再更改栏的可见性,但如果您愿意,您不需要数据触发器中的任何设置器,除了

<Setter Property="Visibility" Value="Collapsed"/>
<!-- ... -->
<!-- and -->
<Setter Property="Visibility" Value="Visible"/>

这样,您可以根据窗口状态更改栏的可见性,并且边框半径和其他属性可以是静态的,因为如果元素不可见,则不需要更改它们。

© www.soinside.com 2019 - 2024. All rights reserved.