Как нарисовать сложную фигуру из кода для пользовательского управления в словаре ресурсов - PullRequest
0 голосов
/ 20 мая 2010

Я новичок в wpf, и у меня возникла проблема, которая может быть или не быть тривиальной. Я определил пользовательский элемент управления в словаре ресурсов следующим образом:

<ResourceDictionary
    x:Class="SyringeSlider.Themes.Generic"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SyringeSlider">
    <Style TargetType="{x:Type local:CustomControl1}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <Canvas Height="{TemplateBinding Height}"  Width="{TemplateBinding Width}" Name="syringeCanvas">

                        </Canvas>
                    </Border>                   
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

К сожалению, я не могу выйти за пределы этого, потому что я хотел бы нарисовать геометрию на холсте, состоящую из набора нескольких геометрических линий, размеры которых рассчитываются как функция от пространства, доступного на холсте. Я полагаю, что для этого мне нужен метод с кодом, но я не смог определить, как связать определение xaml с методом с кодом.

Обратите внимание, что я специально создал класс x: Class = "SyringeSlider.Themes.Generic", но не могу понять, с каким свойством Canvas связать метод рисования.

Мой метод рисования выглядит следующим образом

private void CalculateSyringe()
        {
            int adjHeight = (int) Height - 1;
            int adjWidth = (int) Width - 1;

            // Calculate some very useful values based on the chart above.
            int borderOffset = (int)Math.Floor(m_borderWidth / 2.0f);
            int flangeLength = (int)(adjHeight * .05f);

            int barrelLeftCol = (int)(adjWidth * .10f);
            int barrelLength = (int)(adjHeight * .80);
            int barrelRightCol = adjWidth - barrelLeftCol;

            int coneLength = (int)(adjHeight * .10);

            int tipLeftCol = (int)(adjWidth * .45);
            int tipRightCol = adjWidth - tipLeftCol;
            int tipBotCol = adjWidth - borderOffset;

            Path mySyringePath = new Path();
            PathGeometry mySyringeGeometry = new PathGeometry();
            PathFigure mySyringeFigure = new PathFigure();
            mySyringeFigure.StartPoint = new Point(0, 0);
            Point pointA = new Point(0, flangeLength);
            mySyringeFigure.Segments.Add(new LineSegment(pointA, true));
            Point pointB = new Point();
            pointB.Y = pointA.Y + barrelLength;
            pointB.X = 0;
            mySyringeFigure.Segments.Add(new LineSegment(pointB, true));

            // You get the idea....Add more points in this way

            mySyringeGeometry.Figures.Add(mySyringeFigure);
            mySyringePath.Data = mySyringeGeometry;

        }

ТАК мой вопрос:

1) Имеет ли смысл то, что я пытаюсь сделать? 2) Можно ли использовать холст для этой цели? Если нет, каковы мои другие варианты?

Спасибо!

1 Ответ

0 голосов
/ 20 апреля 2011

Поскольку вы создаете пользовательский элемент управления и создаете шаблон, переопределите функцию OnApplyTemplate () в коде вашего элемента управления. Там вы должны искать части шаблона, а затем вы получаете ссылки в вашем коде.

Примерно так.

public class MyControl : Control
{
    private Canvas myCanvas;

    public override void OnApplyTemplate()
    {
        Canvas theCanvas = Template.FindName("syringeCanvas", this) as Canvas;

        if(theCanvas != null)
        {
            //<-- Save a reference to the canvas
            myCanvas = theCanvas;

            //<-- Do some stuff.
        }
    }
}

Не забудьте назвать свой холст в xaml.

...