我在用SharpVector 的 SvgViewBox https://sharpvectors.codeplex.com/显示静态资源图像,如下所示:
<svgc:SvgViewbox Source="/Resources/label.svg"/>
效果很好。但是,我希望通过绑定到视图模型来控制显示的图像。
我遇到的问题是Source
SvgViewbox 的属性不可绑定。
如何在不违反 MVVM 的情况下绕过此限制(例如,将控件传递到视图模型并在那里修改它)?
您正在寻找的称为附加属性。 MSDN 提供了一个主题,标题为“自定义附加属性 https://msdn.microsoft.com/en-us/library/cc903943%28v=vs.95%29.aspx"
在你的情况下,它可能看起来像这样简单
namespace MyProject.Extensions
{
public class SvgViewboxAttachedProperties : DependencyObject
{
public static string GetSource(DependencyObject obj)
{
return (string) obj.GetValue(SourceProperty);
}
public static void SetSource(DependencyObject obj, string value)
{
obj.SetValue(SourceProperty, value);
}
private static void OnSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var svgControl = obj as SvgViewbox;
if (svgControl != null)
{
var path = (string)e.NewValue;
svgControl.Source = string.IsNullOrWhiteSpace(path) ? default(Uri) : new Uri(path);
}
}
public static readonly DependencyProperty SourceProperty =
DependencyProperty.RegisterAttached("Source",
typeof (string), typeof (SvgViewboxAttachedProperties),
// default value: null
new PropertyMetadata(null, OnSourceChanged));
}
}
XAML 使用它
<SvgViewbox Margin="0 200"
local:SvgViewboxAttachedProperties.Source="{Binding Path=ImagePath}" />
注意local
是命名空间前缀,它应该指向该类所在的程序集/命名空间,即xmlns:local="clr-namespace:MyProject.Extensions;assembly=MyProject"
.
然后只使用您的附加属性(local:Source
)并且从来没有Source
财产。
新的附属财产local:Source
属于 System.Uri 类型。要更新图像,请先指定 null,然后再次指定文件名/文件路径。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)