UWP 自定义矩形形状

Posted

技术标签:

【中文标题】UWP 自定义矩形形状【英文标题】:UWP Custom rectangle shape 【发布时间】:2017-07-02 17:43:32 【问题描述】:

我有以下 XAML 代码:

<Grid>
    <toolkitControls:DropShadowPanel Style="StaticResource DefaultCardDropShadowEffect">
        <Grid CornerRadius="5" Background="Binding AccentColor" Padding="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <!-- Rectangle for border aroung the card -->
            <Rectangle Grid.RowSpan="3" Fill="Binding AccentColor" StrokeLineJoin="Round" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" StrokeDashCap="Round" StrokeDashArray="4" Stroke="White" StrokeThickness="2" RadiusX="5" RadiusY="5"/>
            <!-- Overflowing rectangle -->
            <Rectangle Grid.RowSpan="3" Margin="0,-2,0,-2" Fill="White" RenderTransformOrigin="0.5,0.5" AllowDrop="True">
                <Rectangle.RenderTransform>
                    <CompositeTransform SkewX="-25" TranslateX="-80"/>
                </Rectangle.RenderTransform>
            </Rectangle>

            <Grid HorizontalAlignment="Stretch" Padding="10" Margin="0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>

                <!-- Image and name layout -->
                <Grid VerticalAlignment="Center">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Grid Visibility="Binding ImageSource, Converter=StaticResource NullToVisibilityConverter, ConverterParameter=true">
                        <Ellipse Fill="Orange" Width="45" Height="45"/>
                        <SymbolIcon Symbol="Accept" Foreground="White"/>
                    </Grid>
                    <Ellipse Visibility="Binding ImageSource, Converter=StaticResource NullToVisibilityConverter" Width="45" Height="45">
                        <Ellipse.Fill>
                            <ImageBrush ImageSource="ms-appx:///Assets/Samples/SampleImage.png"/>
                        </Ellipse.Fill>
                    </Ellipse>
                    <TextBlock Grid.Column="1" Text="Binding CardName" VerticalAlignment="Center" FontSize="StaticResource BigTextSize" Padding="10,0,0,0"/>
                    <Button Grid.Column="2" HorizontalAlignment="Right" Padding="0" Margin="0" Width="20" Height="20" Style="StaticResource TiltableAccentButton">
                        <Button.ContentTemplate>
                            <DataTemplate>
                                <Viewbox Width="15" Height="15">
                                    <SymbolIcon Symbol="Edit" Foreground="White"/>
                                </Viewbox>
                            </DataTemplate>
                        </Button.ContentTemplate>
                    </Button>
                </Grid>

                <!-- Number layour -->
                <TextBlock Grid.Row="1" Text="Binding CardNumber" Margin="0,10,0,10" FontSize="24"/>
                <Grid Grid.Row="2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="Binding CardHolderName" FontSize="StaticResource BigTextSize"/>
                    <TextBlock Grid.Column="1" Text="Binding CardExpireDate" FontSize="StaticResource BigTextSize"/>
                </Grid>
            </Grid>
        </Grid>
    </toolkitControls:DropShadowPanel>
</Grid>

我希望 XAML 代码中的第二个矩形具有类似于下一个屏幕上的白色的形式。

在当前的 XAML 代码中,我使用了倾斜和平移转换来完成它,但是矩形在两边都是倾斜的,而且向左平移并超出了父元素的边界。

我该怎么做才能使矩形仅在右侧倾斜?

【问题讨论】:

【参考方案1】:

你需要剪辑它。

您可以在 XAML 中将 RectangleGeometry 附加到您的根 Grid,但您需要在 SizeChanged 事件中手动更新 Rect,只要其宽度或高度得到更新。

<Grid x:Name="Root" SizeChanged="OnRootGridSizeChanged">
    <Grid.Clip>
        <RectangleGeometry Rect="0, 0, WidthOfRoot, HeightOfRoot" />
    </Grid.Clip>

或者,订阅您的根GridLoading 事件,并使用来自Composition 的新InsetClip API。这样你根本不需要手动更新它。

private void OnRootGridLoading(FrameworkElement sender, object args)

    var rootVisual = ElementCompositionPreview.GetElementVisual(Root);
    var clip = rootVisual.Compositor.CreateInsetClip();
    rootVisual.Clip = clip;

【讨论】:

为什么不用多边形而不是剪裁矩形? @jsmyth886 这种方式更加灵活。您可以对其进行动画处理,更改圆角半径、角度等。

以上是关于UWP 自定义矩形形状的主要内容,如果未能解决你的问题,请参考以下文章

自定义边界矩形的形状

将自定义形状应用于剪辑属性 CSS

java自定义鼠标形状

具有自定义形状的自定义 ImageView

自定义按钮上的 XAML UWP 焦点背景

圆形头像以及一些常见需求形状自定义ImageView组件