2011-02-19 2 views
0

ボーダーレスで、自分のバックグラウンドにしたい画像があるWPFアプリケーションを作成しました。ペイントでイメージを作成したので、コーナーを透明にするオプションはありませんでした。アプリケーションの角を丸くしたいのですが、XAMLで期待通りの結果が得られません。私は希望の効果を得るためにボーダーを追加しようとしましたが、私がアプリケーションを実行すると、イメージはまだボーダーの前にあります。ここに私のコードです。私は間違って何をしていますか?ラウンドコーナーのWPFボーダーレスアプリケーション

<Border BorderBrush="Black" CornerRadius="15,15,15,15" BorderThickness="1,1,1,1" Width="242" Height="426"> 
    <Grid> 
     <Image Height="425" Name="image1" Stretch="Fill" Width="240" Source="/Test;component/Test.png" /> 
     <Grid Height="334" HorizontalAlignment="Left" Margin="24,39,0,0" Name="grid1" VerticalAlignment="Top" Width="198" /> 
    </Grid> 
</Border> 
+0

これを解決するためにやったのは、paintshopの写真を編集してコーナーを透明にすることでした。あなたの時間と助けに感謝erezとアンドリューが、私はあなたの答えから期待される結果を得ることができませんでした – poco

+0

私は私の答えを更新しました。それを試してみてください。 – Erez

答えて

0

私は、画像にClipToBounds = "True"を追加する必要があると思います。ウィンドウ内の

+0

ClipToBoundsが機能しませんでした – poco

1

これらの設定は、それが透明になります。

WindowStyle="None" 
AllowsTransparency="True" 
Background="Transparent" 

してからちょうど画像とボーダーの背景を設定します。ここで、ClipToBounds作品ここ

<Border BorderBrush="Transparent" BorderThickness="1" CornerRadius="15"> 
      <Border.Background> 
       <ImageBrush> 
        <ImageBrush.ImageSource> 
       <BitmapImage UriSource="/Test;component/Test.png" /> 
        </ImageBrush.ImageSource> 
       </ImageBrush> 
      </Border.Background> 
     </Border> 
+0

なぜ私は楕円がほしいと思うのですか....私は四角いイメージを持っています。私はエリプスを望んでいません。 – poco

+0

poco私は答えを更新しましたnwoは境界線であり、elipseではありません – Erez

+0

私はこれを試しましたが、境界線はまだ画像の後ろに置かれています...私が上に挙げたものは私が働くことができた唯一の解決策です。 – poco

0

は特別なボーダーです完全に。あなたがErezの答えを "Border"から "ClippingBorder"に変更すると、それはうまくいくはずです。

''' <Remarks> 
'''  As a side effect ClippingBorder will surpress any databinding or animation of 
'''   its childs UIElement.Clip property until the child is removed from ClippingBorder 
''' </Remarks> 

Public Class ClippingBorder 
Inherits Border 
Protected Overrides Sub OnRender(ByVal dc As DrawingContext) 
    OnApplyChildClip() 
    MyBase.OnRender(dc) 
End Sub 

Public Overrides Property Child() As UIElement 
    Get 
     Return MyBase.Child 
    End Get 
    Set(ByVal value As UIElement) 
     If Me.Child IsNot value Then 
      If Me.Child IsNot Nothing Then 
       ' Restore original clipping 
       Me.Child.SetValue(UIElement.ClipProperty, _oldClip) 
      End If 

      If value IsNot Nothing Then 
       _oldClip = value.ReadLocalValue(UIElement.ClipProperty) 
      Else 
       ' If we dont set it to null we could leak a Geometry object 
       _oldClip = Nothing 
      End If 
      MyBase.Child = value 
     End If 
    End Set 
End Property 

Protected Overridable Sub OnApplyChildClip() 
    Dim _child As UIElement = Me.Child 
    If _child IsNot Nothing Then 
     _clipRect.RadiusX = InlineAssignHelper(_clipRect.RadiusY, Math.Max(0.0, Me.CornerRadius.TopLeft - (Me.BorderThickness.Left * 0.5))) 
     _clipRect.Rect = New Rect(_child.RenderSize) 
     _child.Clip = _clipRect 
    End If 
End Sub 

Private _clipRect As New RectangleGeometry() 
Private _oldClip As Object 
Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T 
    target = value 
    Return value 
End Function 

End Class 

そして、あなたがC#の方が好きならば、あなたはhttp://www.developerfusion.com/tools/convert/vb-to-csharp/を使用することができます。

関連する問題