WPF自定义属性

时间:2015-11-01 13:30:12

标签: c# wpf

我已经在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,但是它没有绑定它。

  1. 是否可以仅为Radius的自定义属性键入Extensions:CustomExtensions
  2. 修改 尝试将文本框绑定到此值时,出现此错误:

      

    抛出异常:&#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)}"/>
    

2 个答案:

答案 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)}"/>