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
никогда не ударил, а это означает, что связывание молча неудачу так или иначе.
Кажется, что нет решения. Может кто-то пролить свет на эту проблему?
Благодаря
Вы уверены, что используете структуру 'System.UI.Color'? Если это так, то вы, вероятно, обнаружили ошибку в бета-версии (которая, как представляется, была исправлена.) Простите об этом. – dlev