1

図形を表示するカスタム コンボ ボックスを作成する必要があります。Shape クラスを拡張してシェイプを作成し、DefiningGeometry 関数を次のように実装します。

public abstract class MyShape : Shape
{


    public static readonly DependencyProperty SizeProperty = DependencyProperty.Register("Size", typeof(Double), typeof(MapShape));
    public static readonly DependencyProperty RotationAngleProperty = DependencyProperty.Register("RotationAngle", typeof(Double), typeof(MapShape), new PropertyMetadata(0.0d));

    public double Size
    {
        get { return (double)this.GetValue(SizeProperty); }
        set { this.SetValue(SizeProperty, value); }
    }

    public double RotationAngle
    {
        get { return (double)this.GetValue(RotationAngleProperty); }
        set { this.SetValue(RotationAngleProperty, value); }
    }

    protected override Geometry DefiningGeometry
    {
        get
        { return null; }
    }
}

そのクラスを拡張して、必要な他の形状を作成できます。たとえば、矢印のように見えるものがあります。

public class Arrow : MyShape
{
    public Arrow() { 
    }

    protected override Geometry DefiningGeometry
    {
        get
        {
            double oneThird = this.Size / 3;
            double twoThirds = (this.Size * 2) / 3;
            double oneHalf = this.Size / 2;

            Point p1 = new Point(0.0d, oneThird);
            Point p2 = new Point(0.0d, twoThirds);
            Point p3 = new Point(oneHalf, twoThirds);
            Point p4 = new Point(oneHalf, this.Size);

            Point p5 = new Point(this.Size, oneHalf);
            Point p6 = new Point(oneHalf, 0);
            Point p7 = new Point(oneHalf, oneThird);


            List<PathSegment> segments = new List<PathSegment>(3);
            segments.Add(new LineSegment(p1, true));
            segments.Add(new LineSegment(p2, true));
            segments.Add(new LineSegment(p3, true));
            segments.Add(new LineSegment(p4, true));

            segments.Add(new LineSegment(p5, true));
            segments.Add(new LineSegment(p6, true));
            segments.Add(new LineSegment(p7, true));

            List<PathFigure> figures = new List<PathFigure>(1);
            PathFigure pf = new PathFigure(p1, segments, true);
            figures.Add(pf);
            RotateTransform rt = new RotateTransform(this.RotationAngle);

            Geometry g = new PathGeometry(figures, FillRule.EvenOdd, rt);

            return g;
        }
    }
}

この図形を XAML またはコードに追加すると、問題なく動作します。

現在、これらの形状は、フォームのどこかに関係のないグラフィックス オブジェクトに表示されています。私が持っている要件は、フォーム内のグラフィック オブジェクトの形状がクライアントによって ComboBox から変更されることです。したがって、基本的にはコンボ ボックス内にも図形を表示する必要があります。ここで示しているこれらのクラスを実際に使用する必要はありません。明確にするために、このメモに追加します。ただし、アイテムに形状を表示するには、コンボボックスをカスタマイズする必要があります。私が考えた 1 つの方法は、ControlTemplate を使用することです。他のアイデア、コード、読み物はありますか? ありがとう!

4

1 に答える 1

1

私が理解していれば、のItemTemplateプロパティをカスタマイズすることで、あなたが望むことを達成できますComboBox

 <ComboBox ...>
      <ComboBox.ItemTemplate>
          <DataTemplate>
             <!-- Whatever UI -->
          </DataTemplate>
      </ComboBox.ItemTemplate>
 </ComboBox>
于 2012-12-07T19:57:13.403 に答える