圆角网格角以匹配窗口圆角

时间:2014-01-10 01:50:37

标签: c# wpf

我有一个带圆角的WPF窗口

<Window x:Name="windowPortal" x:Class="ICS2GO.PortalWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Portal" Height="301" Width="489" Icon="/Resources/icon.ico" 
    WindowStyle="None" WindowStartupLocation="CenterScreen" ResizeMode="NoResize" Closing="Window_Closing" Background="Transparent" AllowsTransparency="True">

<Border Name="windowBorder" BorderThickness="2" BorderBrush="DarkBlue" 
    CornerRadius="20" Background="LightBlue" Margin="0,0,0,0">

    <Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
        //main controls, buttons, images ...etc here

        <Grid x:Name="gdWait" >
            <Grid Background="Black" Opacity="0.5"/>
            <Label x:Name="lblStatus" Content="Please Wait" 
                HorizontalAlignment="Center" HorizontalContentAlignment="Center" 
                VerticalContentAlignment="Center"  VerticalAlignment="Center" 
                FontWeight="Bold" Foreground="Red" FontSize="24" Margin="28,51,28,62" 
                Height="72" Width="410"/>

            <ProgressBar x:Name="pbWaiting" HorizontalAlignment="Left" Height="30"
                Margin="110,108,0,0" VerticalAlignment="Top" Width="243"
                IsIndeterminate="True" Orientation="Horizontal"/>
        </Grid>
   </Grid>

网格x:名称=“gbWait”显示在所有主控件上,黑色背景和不透明度设置为允许主控件的一些可见性,但总是让用户无法点击

我想使Grid gbWait的角也是圆角的,所以它与Window的圆角相匹配。目前它们是方形的并且延伸通过窗口角落,它是正常的方形。

4 个答案:

答案 0 :(得分:3)

按如下方式使用Border的Clip属性来满足您的要求。

  <Border Name="windowBorder" BorderThickness="2" BorderBrush="DarkBlue" 
        CornerRadius="20" Background="LightBlue" Margin="0,0,0,0">
        <Border.Clip>
            <RectangleGeometry RadiusX="20" RadiusY="20" Rect="0,0,489,301" >
            </RectangleGeometry>
        </Border.Clip>      
       <Grid></Grid>    
  </Border>

此解决方案假设您的窗口大小为489 x 301,并且无法调整大小。如果需要可调整大小窗口的解决方案,请使用转换器计算RectangleGeometry的Rect值。

答案 1 :(得分:1)

我认为这可能是转换器的理想选择。

将这段代码放在代码隐藏中,或者根据需要放在单独的文件中:

public class VisibilityToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        var visible = (Visibility)value;

        return visible == Visibility.Visible
            ? new SolidColorBrush(System.Windows.Media.Color.FromRgb(70, 130, 180))
            : new SolidColorBrush(System.Windows.Media.Color.FromRgb(173, 216, 230));
    }

    public object ConvertBack(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后在您的XAML中引用它(删除<Grid Background="Black" Opacity="0.5"/>):

<Window.Resources>
    <l:VisibilityToBrushConverter x:Key="converter" />
</Window.Resources>
<Grid>
    <Border Name="windowBorder" BorderThickness="2" BorderBrush="SteelBlue" CornerRadius="20"
            Background="{Binding ElementName=gdWait, Path=Visibility, Converter={StaticResource converter}}" Margin="0,0,0,0">
        <Grid x:Name="gdWait" Visibility="Visible">
            <Label x:Name="lblStatus" Content="Please Wait" HorizontalAlignment="Center" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"  VerticalAlignment="Center" FontWeight="Bold" Foreground="Red" FontSize="24" Margin="28,51,28,62" Height="72" Width="410"/>
            <ProgressBar x:Name="pbWaiting" HorizontalAlignment="Left" Height="30" Margin="110,108,0,0" VerticalAlignment="Top" Width="243" IsIndeterminate="True" Orientation="Horizontal"/>
        </Grid>
    </Border>
</Grid>

答案 2 :(得分:0)

我建议您使用填充制作圆角边框,并使用与网格相同的背景

<Border CornerRadius="10" Padding="10" Background=Black>
<Grid x:Name="gdWait" Visibility="Collapsed">
<Grid Background="Black" Opacity="0.5"/>
    <Label x:Name="lblStatus" Content="Please Wait" HorizontalAlignment="Center" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"  VerticalAlignment="Center" FontWeight="Bold" Foreground="Red" FontSize="24" Margin="28,51,28,62" Height="72" Width="410"/>
    <ProgressBar x:Name="pbWaiting" HorizontalAlignment="Left" Height="30" Margin="110,108,0,0" VerticalAlignment="Top" Width="243" IsIndeterminate="True" Orientation="Horizontal"/>
</Grid>
</Border>

答案 3 :(得分:0)

试试这个

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"       
    xmlns:hp="clr-namespace:WpfApplication2"
    Title="Portal" Height="301" Width="489" Template="{DynamicResource WindowTemplate}"   WindowStyle="None" WindowStartupLocation="CenterScreen"  ResizeMode="NoResize"  Background="Transparent" AllowsTransparency="True">
<Window.Resources>
    <ControlTemplate x:Key="WindowTemplate">
        <Border BorderBrush="DarkBlue" Background="LightBlue" BorderThickness="2" Margin="5" CornerRadius="20">
            <Border BorderBrush="DarkBlue" Background="#576C73" Margin="5" BorderThickness="2"  CornerRadius="20">
                <Grid VerticalAlignment="Stretch" Background="#576C73" HorizontalAlignment="Stretch" Margin="5">
                    <Grid x:Name="gdWait" Margin="5" Background="#576C73" >
                        <Grid Background="#576C73"/>
                        <Label x:Name="lblStatus" Content="Please Wait"  HorizontalAlignment="Center" HorizontalContentAlignment="Center"  VerticalContentAlignment="Center"  VerticalAlignment="Center" FontWeight="Bold" Foreground="Red" FontSize="24" Margin="28,0,28,62" Height="72" Width="410"/>
                        <ProgressBar x:Name="pbWaiting" HorizontalAlignment="Left" Height="30"  Margin="110,108,0,0" VerticalAlignment="Top" Width="243"  IsIndeterminate="True" Orientation="Horizontal"/>
                    </Grid>
                </Grid>
            </Border>
        </Border>
    </ControlTemplate>
</Window.Resources>

我更改了窗口模板..它正在使用不同大小的窗口..抱歉,如果我的要求不对。