Преобразовать путь в геометрическую форму
Привет всем, кого я пытался подвести итог и прийти с основным вопросом и моей идеей, которая до сих пор не работает:S
По сути, мой вопрос таков: пользователь добавляет элементы вместе, и я хочу создать новый элемент на основе этих фигур, чтобы можно было создать новый путь для определенного пользователем элемента. Допустим, у меня есть квадрат и треугольник. Пользователь комбинирует это с домом. Теперь я хочу сделать дом элементом для пользователя. Для этого мне нужен путь элемента, как мне создать это?
Моя идея Используемые элементы фигуры основаны на строках пути. Поэтому я хочу, чтобы они были преобразованы в геометрический элемент, который я смогу использовать позже. Я использую код, предоставленный Meneses в ответе ниже, код скопирован здесь:
public static Geometry PathMarkupToGeometry(ShieldGearViewModel shieldGearModelRec)
{
string pathMarkup = shieldGearModelRec.Gear.Path;
try
{
string xaml =
"<Path " +
"xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" +
"<Path.Data>" + pathMarkup + "</Path.Data></Path>";
var path = System.Windows.Markup.XamlReader.Load(xaml) as System.Windows.Shapes.Path;
// Detach the PathGeometry from the Path
if (path != null)
{
path.Height = shieldGearModelRec.Gear.Height;
path.Width = shieldGearModelRec.Gear.Width;
path.Fill = new SolidColorBrush(Colors.Green);
path.Stretch = Stretch.Fill;
Geometry geometry = path.Data;
//Test not working, exception is thrown
//Rect transRect = new Rect(shieldGearModelRec.Gear.x, shieldGearModelRec.Gear.y, shieldGearModelRec.Gear.Width, shieldGearModelRec.Gear.Height);
//geometry.Transform.TransformBounds(transRect);
path.Data = null;
return geometry;
}
return null;
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
return null;
}
Это я делаю, чтобы получить геометрию, чтобы следовать примеру из этой ссылки описывает. Проблема с вышеупомянутым состоит в том, что я не могу получить доступ к позициям x или y нового элемента геометрии, так как мне указать эту позицию?
Что касается позиции, я думаю, что эта ссылка может быть решением, просто еще не заработал?:)
Когда это будет сделано, я добавлю его в геометрическую группу на основе ссылки before, чтобы я мог получить путь для нового элемента. Но у геометрической группы 0 в качестве границ. Таким образом, чтобы это работало, мне нужно определить x и y для отдельных геометрических элементов, а затем это может решить проблему геомтригруппы, или мне нужно будет посмотреть на это после:) Вопрос стоит слишком долго:|
ТЕКСТ НИЖЕ СТАРЫЙ ВОПРОС И МЫСЛИ
У меня есть строка, которую я хотел бы преобразовать в геометрическую форму в коде позади. Итак, я нашел это в Stackru WPF C# Path: Как получить из строки путь данных к геометрии в коде (не в XAML)
Эта ссылка предполагает, что можно преобразовать строку в путь, используя синтаксический анализ со следующим кодом:
var path = new Path();
path.Data = Geometry.Parse("M 100,200 C 100,25 400,350 400,175 H 280");
Однако синтаксический анализ не доступен на Windows Phone. Мои другие усилия не решили проблему. Я пытался с pathGeometry, но не представляется возможным установить строку в качестве пути?
Поэтому моя проблема заключается в том, как преобразовать строку в геометрическую форму в коде, который не привязан к элементу в представлении.
Первый шаг Итак, мне удалось создать путь со следующим
var pathTesting = new System.Windows.Shapes.Path();
var b = new System.Windows.Data.Binding
{
Source = DecorationOnShield[i].Gear.Path
};
System.Windows.Data.BindingOperations.SetBinding(pathTesting, System.Windows.Shapes.Path.DataProperty, b);
Сейчас я пытаюсь преобразовать путь в геометрическую форму.
дополнительный
Моя идея сделать то же самое, что описано в этой ссылке. Где пример показывает:
var blackRectGeometry = new RectangleGeometry();
Rect rct = new Rect();
rct.X = 80;
rct.Y = 167;
rct.Width = 150;
rct.Height = 30;
blackRectGeometry.Rect = rct;
Но вместо прямоугольника я хотел бы использовать произвольную форму в форме рисунка, но все же иметь возможность задавать такую информацию, как координаты и размер.
дополнительный
Я думал об определении usercontrol, который состоял из пути, который выглядел так:
<UserControl x:Class="UndoRedoShield.View.Geometry"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP8"
mc:Ignorable="d"
Canvas.Left="{Binding Gear.x}" Canvas.Top="{Binding Gear.y}">
<Path Data="{Binding Gear.Path}" Fill="{Binding Gear.Color}" Stretch="Fill" UseLayoutRounding="False" Height="{Binding Gear.Height}" Width="{Binding Gear.Width}" Opacity="{Binding Gear.Opacity}">
<Path.RenderTransform>
<ScaleTransform ScaleX="{Binding Gear.Scale}" ScaleY="{Binding Gear.Scale}"/>
</Path.RenderTransform>
</Path>
</UserControl>
Но я не смог использовать его в отношении геометрии. Кто-нибудь есть идеи, используя этот метод? Любой метод ценится!:)
дополнительный дополнительный:)
Можно ли создать геометрическую фигуру из элементов, чтобы пользовательский элемент управления можно было преобразовать в геометрический контур?
Прогресс
Я нашел эту ссылку, где я могу создать геометрию из контура. Путь имеет свойство width и height.
Но свойства, которых у меня нет в геометрии или пути, следующие:
- Canvas.Left
- Canvas.Top
- Canvas.ZIndex (я думаю, что это возможно, когда я добавлю его в GeometryGroup)
Похоже, это можно сделать с помощью свойства bounds Path.Data. Но не ZIndex. Таким образом, это все еще должно быть проверено с geometryGroup, и Geometry должен быть добавлен в GeometryGroup.
2 ответа
Некоторое время назад, когда я искал решение для этого, я и создал эту функцию. Может быть, это поможет вам.
public static Geometry PathMarkupToGeometry(string pathMarkup)
{
try
{
string xaml =
"<Path " +
"xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" +
"<Path.Data>" + pathMarkup + "</Path.Data></Path>";
var path = XamlReader.Load(xaml) as Path;
// Detach the PathGeometry from the Path
if (path != null)
{
Geometry geometry = path.Data;
path.Data = null;
return geometry;
}
return null;
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
return null;
}
Затем я вызываю эту функцию так:
var arrow = new Path
{
Data = DesignHelpers.PathMarkupToGeometry("M-1,0 L0,1 L1,0"),
Fill = new SolidColorBrush(Colors.Black),
Stretch = Stretch.Fill,
Height = 12,
Width = 18,
HorizontalAlignment = HorizontalAlignment.Center
};
Я не знаю, подойдет ли вам это точно, но, может быть, это поможет.
Geometry.Parse (и, насколько я могу судить, это внутренняя StreamGeometry) действительно отсутствует на платформе Windows Phone, но согласно этой странице: http://msdn.microsoft.com/en-us/library/ms752293(v=vs.110).aspx
WPF предоставляет два класса, которые предоставляют мини-языки для описания геометрических путей: StreamGeometry и PathFigureCollection.
PathFigureCollection доступна для Windows Phone, так что это выглядит как место для проверки:
Теперь вам просто нужно иметь возможность создавать PathGeometry из разметки в стиле XAML. Похоже, здесь есть примеры для генерации Path из синтаксиса XAML:
Преобразовать XAML PathGeometry в WPF PathGeometry
Windows Phone 7: Как разобрать строку пути Безье, как в XAML?
В основном что-то вроде
string data = "M 100,200 C 100,25 400,350 400,175 H 280";
Path path = XamlReader.Load("<Path Data='" + data + "'/>") as Path;