2011-07-06 6 views
2

角を丸めたポリゴンの形を取るカスタムContentControlを作ろうとしています。何らかの理由でコントロールにClipプロパティを設定すると何も表示されません。すべてのヘルプは高く評価されRenderedGeometryはない持っているので... RenderedGeometryにクリップを設定C#ポリゴンを使ってコントロールをクリップする

PageHost.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using System.Windows; 
using System.Windows.Media; 
using System.Windows.Shapes; 
using System.Windows.Controls; 

namespace DtcInvoicer.Controls 
{ 
    public class PageHost:UserControl 
    { 
     #region public ImageSource Icon; 
     public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof(ImageSource), typeof(PageHost)); 
     public ImageSource Icon 
     { 
      get { return GetValue(IconProperty) as ImageSource; } 
      set { SetValue(IconProperty, value); } 
     } 
     #endregion 

     #region public string Title; 
     public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(PageHost)); 
     public string Title 
     { 
      get { return GetValue(TitleProperty).ToString(); } 
      set { SetValue(TitleProperty, value); } 
     } 
     #endregion 

     #region public double Radius; 
     public static readonly DependencyProperty RadiusProperty = DependencyProperty.Register("Radius", typeof(double), typeof(PageHost)); 
     public double Radius 
     { 
      get { return (double)GetValue(RadiusProperty); } 
      set 
      { 
       SetValue(RadiusProperty, value); 
       DoClip(); 
      } 
     } 
     #endregion 

     public PageHost() 
     { 
      Loaded += new RoutedEventHandler(PageHost_Loaded); 
      SizeChanged += new SizeChangedEventHandler(PageHost_SizeChanged); 
     } 

     #region Event Handlers 
     private void PageHost_Loaded(object sender, RoutedEventArgs e) 
     { 
      DoClip(); 
     } 

     private void PageHost_SizeChanged(object sender, SizeChangedEventArgs e) 
     { 
      DoClip(); 
     } 
     #endregion 

     private void DoClip() 
     { 
      Polygon p = new Polygon() 
      { 
       Points = new PointCollection() 
       { 
        new Point(0, 0), 
        new Point(ActualWidth - 30, 0), 
        new Point(ActualWidth, 30), 
        new Point(ActualWidth, ActualHeight), 
        new Point(0, ActualHeight) 
       } 
      }; 

      Geometry g1 = new RectangleGeometry(new Rect(0, 0, ActualWidth, ActualHeight), Radius, Radius); 
      Geometry g2 = p.RenderedGeometry; 

      // Clip = g1; this works, the control shows up with the rounded corners 
      // Clip = g2; this does not work, nothing shows up 

      // this is what I want to do, I want to combine the two geometries 
      // but this does not work either 
      Clip = new CombinedGeometry(GeometryCombineMode.Intersect, g1, g2); 
     } 
    } 
} 

HomePage.xaml

<control:PageHost x:Class="DtcInvoicer.Pages.HomePage" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:control="clr-namespace:DtcInvoicer.Controls" 
     Width="500" Height="250" Radius="20" Background="Aqua"> 
</control:PageHost> 

答えて

4

は、この場合には失敗しました実際にレンダリングされているため、利用できません。定期的なジオメトリの場合は、DoClipでこれを使用します。

Dispatcher.BeginInvoke(DispatcherPriority.Background, new ThreadStart(delegate 
{ 
    Clip = new CombinedGeometry(GeometryCombineMode.Intersect, g1, g2); 
})); 

あなたRenderedGeometryで、あなたはどこか、ビジュアルツリーに追加し、あなたは難しいだろうクリップ領域を設定する前に、そのLoadedイベントを使用する必要があります。 A path geometryのような同じ点を持つ、RenderedGeometryの代わりに通常のGeometryを試してみてください。 PathGeometryを使用して三角形を描く場所の例を次に示します。

double leftPoint = cellRect.Right - 12; 
if (leftPoint < cellRect.Left) 
    leftPoint = cellRect.Left; 
double topPoint = cellRect.Top + (cellRect.Height - 4.0)/2; 
if (topPoint < cellRect.Top) 
    topPoint = cellRect.Top; 
double rightPoint = leftPoint + 7; 
if (rightPoint > cellRect.Right) 
    rightPoint = cellRect.Right; 
double bottomPoint = topPoint + 4; 
if (bottomPoint > cellRect.Bottom) 
    bottomPoint = cellRect.Bottom; 
double middlePoint = leftPoint + 3; 
if (middlePoint > cellRect.Right) 
    middlePoint = cellRect.Right; 

PathFigure figure = new PathFigure(); 
figure.StartPoint = new Point(middlePoint, bottomPoint); 
PathFigureCollection figCollection = new PathFigureCollection(); 
figCollection.Add(figure); 

PathSegmentCollection segCollection = new PathSegmentCollection(); 
LineSegment topSeg = new LineSegment(); 
topSeg.Point = new Point(rightPoint, topPoint); 
segCollection.Add(topSeg); 
LineSegment midRightSeg = new LineSegment(); 
midRightSeg.Point = new Point(leftPoint, topPoint); 
segCollection.Add(midRightSeg); 
LineSegment midLeftSeg = new LineSegment(); 
midLeftSeg.Point = new Point(middlePoint+1, bottomPoint); 
segCollection.Add(midLeftSeg); 
figure.Segments = segCollection; 

PathGeometry geo = new PathGeometry(); 
geo.Figures = figCollection; 
+0

うん私はそれを試みましたが、違いはありませんでした。 –

+0

私は自分の答えを変更しました。 –

+0

ああは意味があります。助けてくれてありがとう! –

関連する問題