【问题标题】:WPF : Rounded-Corners ImagesWPF:圆角图像
【发布时间】:2011-08-30 05:19:48
【问题描述】:
<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Background="Black">
    <!-- Rounded yellow border -->
    <Border BorderThickness="3" BorderBrush="Yellow" CornerRadius="10" Padding="2"
        HorizontalAlignment="Center" VerticalAlignment="Center">
      <Grid>
         <!-- Rounded mask (stretches to fill Grid) -->
         <Border Name="mask" Background="White" CornerRadius="7"/>
         <!-- Main content container -->
         <StackPanel>
             <!-- Use a VisualBrush of 'mask' as the opacity mask -->
             <StackPanel.OpacityMask>
                 <VisualBrush Visual="{Binding ElementName=mask}"/>
             </StackPanel.OpacityMask>
             <!-- Any content -->
             <Image Source="http://chriscavanagh.files.wordpress.com/2006/12/chriss-blog-banner.jpg"/>
             <Rectangle Height="50" Fill="Red"/>
             <Rectangle Height="50" Fill="White"/>
             <Rectangle Height="50" Fill="Blue"/>
         </StackPanel>
      </Grid>
    </Border>
</Page>

此 XAML 来自 WPF – Easy rounded corners for anything,但对我不起作用 =(

<Border Canvas.Left="55"
        Canvas.Top="30"
        Width="100"
        Height="Auto"
        Margin="12,12,8,0"
        VerticalAlignment="Top"
        BorderBrush="#FF3B5998"
        BorderThickness=".5"
        CornerRadius="18">
    <Border.Effect>
        <DropShadowEffect BlurRadius="5"
                          Opacity=".5"
                          ShadowDepth="3" />
    </Border.Effect>
    <Border Name="ReceiverColor"
            BorderBrush="#FF96B2E4"
            BorderThickness="6"
            CornerRadius="15">
        <Border Name="Mask"
                BorderBrush="#FF3B5998"
                BorderThickness=".5"
                CornerRadius="13">
                <StackPanel>
                    <StackPanel.OpacityMask>
                        <VisualBrush Visual="{Binding ElementName=Mask}" />
                    </StackPanel.OpacityMask>
                    <Image Name="Receiver" />
                </StackPanel>
        </Border>
    </Border>
</Border>

--- 编辑 ---
我将边框大小设置为自动并将图像源更改为链接中的图像
当窗口加载边框大小变为图像大小但图像不显示时!!!

【问题讨论】:

    标签: wpf xaml rounded-corners


    【解决方案1】:

    您忘记了使蒙版和图像同胞并将图像嵌套在蒙版中的网格。你忘了设置蒙版的背景。

    这行得通:

    <Grid>
        <Border Canvas.Left="55"
                Canvas.Top="30"
                Width="100"
                Height="Auto"
                Margin="12,12,8,0"
                VerticalAlignment="Top"
                BorderBrush="#FF3B5998"
                BorderThickness=".5"
                CornerRadius="18">
            <Border.Effect>
                <DropShadowEffect BlurRadius="5"
                                  Opacity=".5"
                                  ShadowDepth="3" />
            </Border.Effect>
            <Border Name="ReceiverColor"
                    BorderBrush="#FF96B2E4"
                    BorderThickness="6"
                    CornerRadius="15">
                <Grid>
                    <Border Name="Mask"
                            Background="White"
                            BorderBrush="#FF3B5998"
                            BorderThickness=".5"
                            CornerRadius="13">
                    </Border>
                    <StackPanel>
                        <Image Name="Receiver"
                               Source="/Images/test.jpg" />
                        <StackPanel.OpacityMask>
                            <VisualBrush Visual="{Binding ElementName=Mask}" />
                        </StackPanel.OpacityMask>
                    </StackPanel>
                </Grid>
            </Border>
        </Border>
    </Grid>
    

    【讨论】:

    • 不是第一个代码来自文章,但第二个代码来自我的项目
    【解决方案2】:

    在 wpf 中,这个对我有用

        <Ellipse Width="50" Height="50">
            <Ellipse.Fill>
                <ImageBrush ImageSource="http://chriscavanagh.files.wordpress.com/2006/12/chriss-blog-banner.jpg" />
            </Ellipse.Fill>
         </Ellipse>
    

    【讨论】:

    • 此解决方案无法控制实际半径 - 您无法控制实际图像。如果您需要椭圆,这是一个很好的解决方案 - 但这与问题所问的圆角不同。
    【解决方案3】:
    <Grid Background="Black">
    <Rectangle RadiusX="20" RadiusY="20"
    Width="130"
    Height="130">
    <Rectangle.Fill>
    <ImageBrush x:Name="myImage" ImageSource="C:\Path\Desktop\visual-studio-2010-logo.png"/>
    </Rectangle.Fill>
    </Rectangle>
    </Grid>
    

    【讨论】:

    • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
    【解决方案4】:

    您可以定义一个&lt;Border/&gt; 元素并设置它的&lt;Border.Background/&gt; 属性为 &lt;ImageBrush/&gt; ,设置 Borders CornerRadius 属性,你 都设置好了!

    <Border CornerRadius="8,0,8,0">
        <Border.Background>
            <ImageBrush Stretch="Fill" ImageSource="ImageSource"/>
        </Border.Background>
    </Border>
    

    【讨论】:

      【解决方案5】:

      你可以像 Usman Ali 所说的那样使用椭圆(我自己也这么想,但我没有从他那里得到它)

      这很简单,用你想要的属性制作一个椭圆,然后在 XAML 中用你想要的图像将填充设置为一个图像刷:

      <Ellipse Height="Auto" Width="100">
          <Ellipse.Fill>
              <ImageBrush ImageSource="YOUR IMAGE SOURCE/LINK HERE"/>
          </Ellipse.Fill>
      </Ellipse>
      

      在 C# 中,如果你想在 C# 中做任何情况:

      Ellipse YourEllipseName = new Ellipse
      {
          Height = 50,
          Width = 50,
          StrokeThickness = 0,
          Fill = new ImageBrush
          {
              Stretch = Stretch.Uniform,
              ImageSource = new BitmapImage(new Uri("YOUR IMAGE SOURCE HERE"))
          }
      };
      

      【讨论】:

        【解决方案6】:

        以上答案都不适合我。我试图在图像上实现圆角,它可以调整大小并具有属性Stretch="UniformToFill"VerticalAlignment="Center"HorizontalAlignment="Center"。 调整图像大小时,中心对齐保持中间部分被裁剪,而不是底部和右侧被裁剪。使用图像画笔的解决方案有效,但我在将内容保持在中心裁剪时遇到了问题。

        标记的答案存在透明非矩形图像的问题,因为“蒙版”边框最终将显示为白色背景。以下是对我有用的实施:

        <Grid>
            <WrapPanel Name ="container">
                <Image Source="sample_image.png" VerticalAlignment="Center" HorizontalAlignment="Center" Stretch="UniformToFill"/>
                <WrapPanel.OpacityMask>
                    <VisualBrush >
                        <VisualBrush.Visual>
                            <Border Height="{Binding ElementName=container, Path=ActualHeight}" 
                                    Width="{Binding ElementName=container, Path=ActualWidth}"
                                    Background="White" CornerRadius="15" />
                        </VisualBrush.Visual>
                    </VisualBrush>
                </WrapPanel.OpacityMask>
            </WrapPanel>
        </Grid>
        

        【讨论】:

          猜你喜欢
          • 2013-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-16
          • 2012-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多