2012-05-29 3 views
0

Ive писал сложный пользовательский контроль в Metro/XAML с использованием C#.Метро XAML - цветные привязки не работают

Чтобы проиллюстрировать свою точку зрения, я создал минимальный сценарий для вашего внимания.

Простой пользовательский элемент управления ниже:

public sealed class TestControl : Control 
{ 
    public static DependencyProperty TestTextProperty = DependencyProperty.Register("TestText", typeof(string), typeof(TestControl), new PropertyMetadata(string.Empty)); 

    public string TestText 
    { 
     get { return (string) GetValue(TestTextProperty); } 
     set { SetValue(TestTextProperty, value); } 
    } 

    public static DependencyProperty TestColorProperty = DependencyProperty.Register("TestColor", typeof(Color), typeof(TestControl), new PropertyMetadata(Colors.Blue)); 

    public Color TestColor 
    { 
     get { return (Color)GetValue(TestColorProperty); } 
     set { SetValue(TestColorProperty, value); } 
    } 

    public TestControl() 
    { 
     this.DefaultStyleKey = typeof(TestControl); 
    } 
} 

управления Thie имеет два свойства зависимостей, свойство Text и свойство цвета.

Вот мой стандартный стиль управления в Generic.xaml

<Style TargetType="local:TestControl"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:TestControl"> 
       <Border 
        Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}"> 
        <TextBlock Text="{TemplateBinding TestText}"> 
         <TextBlock.Foreground> 
          <SolidColorBrush Color="{Binding Source={RelativeSource Mode=TemplatedParent}, Path=TestColor}" /> 
         </TextBlock.Foreground> 
        </TextBlock> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Есть две проблемы:

1) этот код обыкновение компилировать:

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}"> 
    <local:TestControl x:Name="testcont" TestText="Hello" TestColor="Red" /> 
</Grid> 

Ошибка:

Тип значения Цвет не допускается по свойству TestCol или в XAML BlankPage.xaml

Так что кажется, что преобразователь типа для цвета сломан (я полагаю). Чтобы обойти эту проблему, я установить свойство TestColor в код-за:

public BlankPage() 
{ 
    this.InitializeComponent(); 
    testcont.TestColor = Colors.Red; 
} 

Это позволяет компилировать код, однако цвет никогда не будет правильно установлен в шаблоне. Я даже использовал ValueConverter:

<TextBlock.Foreground> 
    <SolidColorBrush Color="{Binding Source={RelativeSource Mode=TemplatedParent}, Path=TestColor, Converter={StaticResource DebugConverter}}" /> 
</TextBlock.Foreground> 

Но точка останова в ValueConverter никогда не ударил, а это означает, что связывание молча неудачу так или иначе.

Кажется, что нет решения. Может кто-то пролить свет на эту проблему?

Благодаря

+1

Вы уверены, что используете структуру 'System.UI.Color'? Если это так, то вы, вероятно, обнаружили ошибку в бета-версии (которая, как представляется, была исправлена.) Простите об этом. – dlev

ответ

0

Вы должны использовать Brush, не Color:

testcont.TestColor = Brushes.Red; 

DependencyProperty также должна быть кисть, а не цвет. Вы можете использовать цвет, но вам придется преобразовать цвет в кисть.

+0

Я не хочу использовать кисть, мне нужно использовать цвет. В моем фактическом контроле я оживляю цвета с визуальными переходами состояния –

+0

Моя ошибка, я неправильно понял вопрос. –

0

Существует два пространства имен, которые определяют тип цвета, System.Drawing и System.Windows.Media. Свойство цвета, вероятно, относится к пространству имен чертежей, а XAML использует пространство имен мультимедиа.

Используйте тип System.Windows.Media.Brush вместо Color (опять же пространство имен важно) и добавьте атрибут Bindable(true) для свойства CLR.

Чтобы продемонстрировать, посмотрите на объявлении свойства фона на Control:

[Bindable(true), Category("Appearance")] 
public Brush Background 
{ 
    get 
{ 
    return (Brush)base.GetValue(Control.BackgroundProperty); 
} 
set 
{ 
    base.SetValue(Control.BackgroundProperty, value); 
} 
} 
1

Там, как известно, проблемы с свойства зависимостей типа значения: Value Type Duration is not allowed on property Duration in XAML MS говорит, что это будет исправлено.В настоящее время вы можете изменить свой тип собственности с «Цвет на объект».

+0

и обратите внимание, что существует еще одна проблема с привязками TemplatedParent: https://connect.microsoft.com/VisualStudio/feedback/details/741181/relativesource-templatedparent-binding-doesnt-work-in-metro-applications – notacat

+0

Большое спасибо - просто возникла аналогичная проблема и изменение привязки с пользовательского типа, чтобы объект решил мою проблему. –