2015-11-01 7 views
0

Я добавил новое свойство в элемент управления ProgresBar, как бы то ни было, я не думаю, что делаю это правильно. Ниже находится индикатор прогресса в MainWindow.xaml, мне нужно иметь 2 значения с разрывом между ними.WPF Custom Property

<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}}"> 

Действительно у меня 2 вопроса: 1. не кажется, значения этого следует применять к моему ControlTemplate, как если бы я удалить связывании ввести 140 0 себя он показывает ArcSegment, однако с его связывания не делает.

  1. Можно ли набрать Radius для нестандартного объекта без Extensions:CustomExtensions?

Edit: При попытке связать текстовое поле для этого значения я получаю эту ошибку:

Exception thrown: 'System.Windows.Markup.XamlParseException' in PresentationFramework.dll

Additional information: 'Provide value on 'System.Windows.Baml2006.TypeConverterMarkupExtension' threw an exception.' Line number '36' and line position '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)}"/> 
+1

Для меня связывания с элементом и только «Радиус», как путь работал (как я писал в своем ответе после изменения вложенное свойство), поэтому если ошибка не приходит от этого, я предполагаю, что это может произойти из предыдущей привязки (попробуйте без него -> давая жестко закодированное значение, как в вашем первом примере) – kirotab

ответ

1

Вы должны использовать специальный синтаксис, если привязку к вложенному свойству (в скобках вокруг прикрепленного имущества). Кроме того, вы должны указать конвертер для преобразования строки в точку.

Вот пример:

<PathFigure x:Name="pathFigure" StartPoint="{Binding Path=(Extensions:CustomExtensions.Radius), RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource pointConverter}"> 

Edit: я был не в состоянии воспроизвести проблему. Я использую следующий код и текст-блок имеет правильный вывод:

<ProgressBar Extensions:CustomExtensions.Radius="80" Name="test"/> 
<TextBlock Text="{Binding ElementName=test, Path=(Extensions:CustomExtensions.Radius)}"/> 
+0

Спасибо еще один вопрос, см. редактирование. –

+0

@MartynBall Смотрите мое редактирование. – Stipo

1

я был неправ в своем первоначальном ответе, тип прикрепленного имущества был определен правильно и он должен быть CustomExtensions не ProgressBar

ownerType - The owner type that is registering the dependency property. 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}"/>