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,但有了绑定就没有了。

  1. 是否可以只为自定义属性键入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)}"/>

WPF自定义属性

如果绑定到附加属性(在附加属性周围用括号),则必须使用特殊语法。此外,您还应该指定一个转换器来将字符串转换为点。

这里有一个例子:

<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参考

您必须将所附属性typeof(ProgressBar)设置为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}"/>