在代码隐藏中设置 Path.Data
Setting Path.Data in code-behind
我有这个 XAML 代码,它使 Path
位于 MainPage.xaml 页面中的 Canvas
中。
<Path x:Name="progressPath" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Stroke="Gold" StrokeThickness="5"
Canvas.Left="300" Canvas.Top="300" Height="305" Width="305"
Data="m 150,0 A 150,0 0 0 0 150,0 A 150,150 0 0 0 150,0">
</Path>
我想有几个这样的Path
(例如,当用户点击一个按钮时会产生一个新的Path
),所以我决定在代码中创建它们-落后-这似乎是不可能的。
Path
的 Data
在 Silverlight 中填充了 move and draw commands syntax which cannot directly be used as a text value (as shown above) in code-behind like it can be in xaml - I've found workarounds for this,我在我的 Metro/Windows-Store 应用程序中尝试了相同的技术,但尽管它编译正确,但有屏幕上没有Path
。
tl;dr 如何在代码隐藏中创建此 Path
并显示 Data
?
我前阵子在winrt也遇到过这个问题。似乎您不能直接在代码后面分配 "path" 值。
不过还是有办法的here
我在winrt中用这个class没有任何问题。我所要做的就是更改 Convert 和 ConvertBack 方法的签名以实现 IValueConverter 接口,因为它在 winrt 中而不是在 silverlight 中。
他们在这里
public object Convert(object value, Type targetType, object parameter, string language)
{
string path = value as string;
if (null != path)
return Convert(path);
else
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
PathGeometry geometry = value as PathGeometry;
if (null != geometry)
return ConvertBack(geometry);
else
return default(string);
}
用法:(或多或少)
var stringToPathGeometryConverter = new StringToPathGeometryConverter();
string pathData = "m 150,0 A 150,0 0 0 0 150,0 A 150,150 0 0 0 150,0" ;
progressPath.Data = stringToPathGeometryConverter.Convert(pathData);
另一种方法是为此使用 XamlReader 并加载适当的字符串。在 C#6.0 中,它看起来像这样:
Path pathFromCode = XamlReader.Load($"<Path xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'><Path.Data>{stringPathData}</Path.Data></Path>") as Path;
我找到了一种更简单的替代方法来在代码隐藏中创建 Path
。
var converter = TypeDescriptor.GetConverter(typeof(Geometry));
string pathData = "m 150,0 A 150,0 0 0 0 150,0 A 150,150 0 0 0 150,0";
var path = new Path
{
Data = (Geometry)converter.ConvertFrom(pathData),
};
我有这个 XAML 代码,它使 Path
位于 MainPage.xaml 页面中的 Canvas
中。
<Path x:Name="progressPath" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Stroke="Gold" StrokeThickness="5"
Canvas.Left="300" Canvas.Top="300" Height="305" Width="305"
Data="m 150,0 A 150,0 0 0 0 150,0 A 150,150 0 0 0 150,0">
</Path>
我想有几个这样的Path
(例如,当用户点击一个按钮时会产生一个新的Path
),所以我决定在代码中创建它们-落后-这似乎是不可能的。
Path
的 Data
在 Silverlight 中填充了 move and draw commands syntax which cannot directly be used as a text value (as shown above) in code-behind like it can be in xaml - I've found workarounds for this,我在我的 Metro/Windows-Store 应用程序中尝试了相同的技术,但尽管它编译正确,但有屏幕上没有Path
。
tl;dr 如何在代码隐藏中创建此 Path
并显示 Data
?
我前阵子在winrt也遇到过这个问题。似乎您不能直接在代码后面分配 "path" 值。
不过还是有办法的here
我在winrt中用这个class没有任何问题。我所要做的就是更改 Convert 和 ConvertBack 方法的签名以实现 IValueConverter 接口,因为它在 winrt 中而不是在 silverlight 中。 他们在这里
public object Convert(object value, Type targetType, object parameter, string language)
{
string path = value as string;
if (null != path)
return Convert(path);
else
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
PathGeometry geometry = value as PathGeometry;
if (null != geometry)
return ConvertBack(geometry);
else
return default(string);
}
用法:(或多或少)
var stringToPathGeometryConverter = new StringToPathGeometryConverter();
string pathData = "m 150,0 A 150,0 0 0 0 150,0 A 150,150 0 0 0 150,0" ;
progressPath.Data = stringToPathGeometryConverter.Convert(pathData);
另一种方法是为此使用 XamlReader 并加载适当的字符串。在 C#6.0 中,它看起来像这样:
Path pathFromCode = XamlReader.Load($"<Path xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'><Path.Data>{stringPathData}</Path.Data></Path>") as Path;
我找到了一种更简单的替代方法来在代码隐藏中创建 Path
。
var converter = TypeDescriptor.GetConverter(typeof(Geometry));
string pathData = "m 150,0 A 150,0 0 0 0 150,0 A 150,150 0 0 0 150,0";
var path = new Path
{
Data = (Geometry)converter.ConvertFrom(pathData),
};