Назначьте данные пути элементу управления Thumb программным способом и добавьте его в Canvas - PullRequest
0 голосов
/ 28 октября 2019

То, что я пытаюсь сделать, это программно создать прямоугольник в определенном месте, и я хочу назначить его элементу управления Thumb перед добавлением в Canvas. Причина в том, что я хочу реализовать перетаскивание позже. Но проблема с этим кодом ниже в том, что я никогда не вижу ничего внутри Canvas, пожалуйста, помогите. При попытке отладки я не вижу данных в переменной факта, и t.HasContent имеет значение false.

 public void DrawShape2()
        {
            Thumb th = new Thumb();

            Path myPath1 = new Path();
            myPath1.Stroke = Brushes.Black;
            myPath1.StrokeThickness = 1;
            SolidColorBrush mySolidColorBrush = new SolidColorBrush();
            mySolidColorBrush.Color = Color.FromArgb(255, 204, 204, 255);
            myPath1.Fill = mySolidColorBrush;

            Point a = new Point(25, 150);
            Point b = new Point(500, 490);

            Rect myRect1 = new Rect(a, b);
            RectangleGeometry myRectangleGeometry1 = new RectangleGeometry();
            myRectangleGeometry1.Rect = myRect1;

            GeometryGroup myGeometryGroup1 = new GeometryGroup();
            myGeometryGroup1.Children.Add(myRectangleGeometry1);

            myPath1.Data = myGeometryGroup1;

            ControlTemplate t = new ControlTemplate();
            var fact = new FrameworkElementFactory(typeof(Path));
            fact.SetValue(Path.DataProperty, myPath1.Data);
            t.VisualTree = fact;
            th.Template = t;
            cnv.Children.Add(th);
        }

1 Ответ

2 голосов
/ 28 октября 2019

Причина, по которой ваш код не работает, заключается в том, что вы неправильно создаете ControlTemplate.

ПРИМЕЧАНИЕ. Microsoft рекомендует создать XAML в виде строки, а затем проанализировать ее с помощью XamlReader.Parse вместо использования FrameworkElementFactory.

Ниже приведены две версии кода. 1 с использованием XamlReader.Parse и 2 с использованием FrameworkElementFactory.

XamlReader.Parse

var th = new Thumb();

var controlTemplate =
    "<ControlTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" TargetType=\"Thumb\">" +
    "<Path Stroke=\"Black\" StrokeThickness=\"1\" Fill=\"#FFCCCCFF\">" +
    "<Path.Data>" +
    "<GeometryGroup>" +
    "<RectangleGeometry Rect=\"25,150,500,490\"/>" +
    "</GeometryGroup>" +
    "</Path.Data>" +
    "</Path>" +
    "</ControlTemplate>";

th.Template = (ControlTemplate) XamlReader.Parse(controlTemplate);

Canvas.Children.Add(th);

FrameworkElementFactory

var th = new Thumb();

var a = new Point(25, 150);
var b = new Point(500, 490);

var myRect1 = new Rect(a, b);
var myRectangleGeometry1 = new RectangleGeometry {Rect = myRect1};

var myGeometryGroup1 = new GeometryGroup();
myGeometryGroup1.Children.Add(myRectangleGeometry1);

var t = new ControlTemplate(typeof(Thumb));
var path = new FrameworkElementFactory(typeof(Path));
path.SetValue(Shape.StrokeProperty, Brushes.Black);
path.SetValue(Shape.StrokeThicknessProperty, 1d);
path.SetValue(Shape.FillProperty, new SolidColorBrush{Color = Color.FromArgb(255, 204, 204, 255)});
path.SetValue(Path.DataProperty, myGeometryGroup1);
t.VisualTree = path;
th.Template = t;
Canvas.Children.Add(th);

Надеюсь, это полезно.

...