WPF自定义属性
本文关键字:自定义属性 WPF | 更新日期: 2023-09-27 18:20:01
我为ProgresBar控件添加了一个新属性,但我认为我做得不正确。下面是MainWindow.xaml中的进度条,我需要有两个值,它们之间有一个间隙。
<ProgressBar Style="{StaticResource CircularProgress}"
Value="50"
Extensions:CustomExtensions.Radius="140 0" />
现在这是我的自定义扩展,我把它做成了一个字符串,因为这两个数字之间有一个间隙。
public static readonly DependencyProperty RadiusProperty =
DependencyProperty.RegisterAttached("Radius", typeof(string), typeof(CustomExtensions), new PropertyMetadata(default(string)));
public static void SetRadius(UIElement element, string value)
{
element.SetValue(RadiusProperty, value);
}
public static string GetRadius(UIElement element)
{
return (string)element.GetValue(RadiusProperty);
}
现在我在这里使用这个自定义属性,但它不起作用。
<PathFigure x:Name="pathFigure" StartPoint="{Binding Path=Radius, RelativeSource={RelativeSource TemplatedParent}}">
真的,我有两个问题:1.这些值似乎不适用于我的ControlTemplate,就好像我自己删除了绑定并输入140 0
一样,它显示了ArcSegment,但有了绑定就没有了。
- 是否可以只为自定义属性键入
Radius
而不键入Extensions:CustomExtensions
编辑:当试图将文本框绑定到此值时,我会得到以下错误:
引发异常:中的"System.Windows.Markup.XamlParseException"PresentationFramework.dll
附加信息:'提供价值"System.Windows.Baml2006.TypeConverterMarkupExtension"引发了异常。'行号"36"和行位置"20"。
代码:
<ProgressBar Style="{StaticResource CircularProgress}"
Value="{Binding Source={StaticResource runtimeVariables},Path=uploadProgress}"
Extensions:CustomExtensions.Radius="80"
Name="test"/>
<TextBlock Text="{Binding ElementName=test, Path=(Extensions:CustomExtensions.Radius)}"/>
如果绑定到附加属性(在附加属性周围用括号),则必须使用特殊语法。此外,您还应该指定一个转换器来将字符串转换为点。
这里有一个例子:
<PathFigure x:Name="pathFigure" StartPoint="{Binding Path=(Extensions:CustomExtensions.Radius), RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource pointConverter}">
编辑:我无法复制你的问题。我使用以下代码和文本块有正确的输出:
<ProgressBar Extensions:CustomExtensions.Radius="80" Name="test"/>
<TextBlock Text="{Binding ElementName=test, Path=(Extensions:CustomExtensions.Radius)}"/>
我最初的回答是错误的,所附属性的类型定义正确,应该是CustomExtensions
而不是ProgressBar
ownerType-正在注册依赖属性的所有者类型。MSDN参考
您必须将所附属性设置为ProgressBartypeof(ProgressBar)
public static readonly DependencyProperty RadiusProperty =
DependencyProperty.RegisterAttached(
"Radius", typeof(string),
typeof(CustomExtensions),
new PropertyMetadata(default(string))
);
以下是如何轻松测试
<ProgressBar x:Name="testProgressBar"
Value="50"
local:CustomExtensions.Radius="140 0" />
<TextBlock Text="{Binding ElementName=testProgressBar, Path=Radius}"/>