我已经在ProgresBar控件中添加了一个新属性,但我怎么认为我没有正确地做到这一点。下面是MainWindow.xaml中的进度条,我需要有2个值,它们之间有差距。
<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
? 修改 尝试将文本框绑定到此值时,出现此错误:
抛出异常:&#39; System.Windows.Markup.XamlParseException&#39;在 PresentationFramework.dll
其他信息:&#39;提供价值 &#39; System.Windows.Baml2006.TypeConverterMarkupExtension&#39;扔了一个 。例外&#39;行号&#39; 36&#39;和行位置&#39; 20&#39;。
代码:
<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)}"/>
答案 0 :(得分:1)
我的原始答案错了,附加属性的类型已正确定义,应该是CustomExtensions
而不是ProgressBar
ownerType - 正在注册依赖项属性的所有者类型。 MSDN Reference
您必须将ProgressBar设置为附加属性 typeof(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}"/>
答案 1 :(得分:1)
如果绑定到附加属性(附加属性周围带括号),则必须使用特殊语法。此外,您应指定转换器以将字符串转换为Point。
以下是一个例子:
<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)}"/>