У меня небольшие проблемы со свойствами зависимостей в приложении Windows Phone Mango. Вот два элемента управления, размер шрифта которых я хотел бы изменить динамически:
<TextBlock Text="{Binding}" FontSize="{Binding ElementName=ParagraphItems, Path=DataContext.TextScale}" />
<local:HyperlinkTextBlock Text="{Binding}" FontSize="{Binding ElementName=ParagraphItems, Path=DataContext.TextScale}" />
TextBlock
работает нормально, а HyperlinkTextBlock
- нет. HyperlinkTextBlock
это класс, который я сделал:
<UserControl
<!-- ... -->
>
<RichTextBox x:Name="LayoutRoot" TextWrapping="Wrap" FontSize="{Binding FontSize}">
<Paragraph x:Name="BaseParagraph" />
</RichTextBox>
</UserControl>
public partial class HyperlinkTextBlock : UserControl { /* ... */ }
Я не уверен, что мне нужно сделать в HyperlinkTextBlock
, чтобы он мог получать значения FontSize
, когда он объявлен в XAML. Я попытался привязать свойство к HyperlinkTextBlock.xaml
и уведомил об изменении свойства в выделенном коде:
public new double FontSize
{
get
{
return base.FontSize;
}
set
{
base.FontSize = value;
onPropChanged("FontSize");
}
}
(Это new
, потому что UserControl
уже имеет свойство FontSize
- разве я не смогу использовать это?)
Я также попытался создать совершенно новое свойство зависимости:
public static readonly new DependencyProperty FontSizeProperty = DependencyProperty.RegisterAttached(
"FontSize",
typeof(double),
typeof(HyperlinkTextBlock),
new PropertyMetadata(20, new PropertyChangedCallback(onFontSizeChanged)));
public new double FontSize
{
get { return (double)GetValue(FontSizeProperty); }
set { SetValue(FontSizeProperty, value); }
}
private static void onFontSizeChanged(DependencyObject dependObj, DependencyPropertyChangedEventArgs e)
{
((HyperlinkTextBlock)dependObj).LayoutRoot.FontSize = (double)e.NewValue;
}
Точно так же это не сработало. Во время выполнения выдает ошибку:
System.ArgumentException was unhandled
Message=Default value type does not match type of property.
StackTrace:
at System.Windows.DependencyProperty.Register(Boolean fIsAttachedDP, String name, Type propertyType, Type ownerType, PropertyMetadata propertyMetadata, Boolean readOnly)
at System.Windows.DependencyProperty.RegisterAttached(String name, Type propertyType, Type ownerType, PropertyMetadata defaultMetadata)
at MyApp.Views.HyperlinkTextBlock..cctor()
at System.Reflection.RuntimeConstructorInfo.InternalInvoke(RuntimeConstructorInfo rtci, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
at System.Reflection.RuntimeConstructorInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
at System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
at MS.Internal.TypeProxy.<>c__DisplayClass30.<GetCreateObjectDelegate>b__2a()
at MS.Internal.TypeProxy.CreateInstance(UInt32 customTypeId)
at MS.Internal.XamlManagedRuntimeRPInvokes.CreateInstance(XamlTypeToken inXamlType, XamlQualifiedObject& newObject)
Какой правильный способ сделать это?
Обновление
Если я просто установлю FontSize
непосредственно на HyperlinkTextBlock
:
<local:HyperlinkTextBlock Text="{Binding}" Margin="0,15" FontSize="33.0" />
<local:HyperlinkTextBlock Text="{Binding}" Margin="0,15" FontSize="40" />
И удалите что-нибудь о FontSize
из HyperlinkTextBlock
:
<RichTextBox x:Name="LayoutRoot" TextWrapping="Wrap">
<Paragraph x:Name="BaseParagraph" />
</RichTextBox>
Тогда нет заметного эффекта от установки размера шрифта. (Два объявленных выше текстовых блока выглядят одинаково.)