2014-01-10 46 views
1

我有带圆角圆角网格角匹配窗口圆角

<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 WPF窗口:名称=“gbWait”被显示在所有主控制与黑色背景和不透明度设置为允许一些主要控件的可粘性,但总是让它们不可点击的用户

我想使网格gbWait的圆角也是圆形的,所以它与窗口的圆角相匹配。目前他们是正方形的,并延伸到正常方形的窗户角落。

回答

3

按如下所示使用边框的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值。

+0

这正是我所需要的。非常感谢。 – Tsukasa

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> 
+0

我使用它的效果,所以它为我的目的。 – Tsukasa

+0

@Tsukasa我明白你在做什么。这是一个可以保持圆角效果的替代解决方案。相应地更改颜色。最上面的一个是当内部网格可见时,而最下面的一个是隐藏的。 –

+0

什么是转换器?资源转换器无法解析 – Tsukasa

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> 
+0

这确实可以让它们保持平直,但在视觉上它看起来并不像我的圆角那么好。最糟糕的是最糟糕的,这是我可能必须解决的,如果没有解决方案 – Tsukasa

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> 

我已经改变了窗口模板..和它工作在不同大小的窗口的..对不起,如果我错了,您的要求。