我实现了一个带有依赖项属性的用户控件,如下所示:
public partial class MyUC : UserControl, INotifyPropertyChanged
{
public static readonly DependencyProperty MyBackgroundProperty =
DependencyProperty.Register("MyBackground", typeof(Brush), typeof(MyUC),
new FrameworkPropertyMetadata(Brushes.White,
FrameworkPropertyMetadataOptions.AffectsRender));
public Brush MyBackground
{
get { return (Brush)GetValue(MyBackgroundProperty); }
set { SetValue(MyBackgroundProperty, value); }
}
//...
}
并尝试在XAML中设置此属性,如下所示:
<UserControl x:Class="Custom.MyUC"
x:Name="myUCName"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Custom"
mc:Ignorable="d"
TabIndex="0" KeyboardNavigation.TabNavigation="Local"
HorizontalContentAlignment="Left" VerticalContentAlignment="Top"
MouseLeftButtonDown="OnMouseLeftButtonDown">
<UserControl.Style>
<Style TargetType="local:MyUC">
<Setter Property="MyBackground" Value="Black"/>
</Style>
</UserControl.Style>
<Border BorderThickness="0">
//...
</Border>
</UserControl>
它编译但是当我运行应用程序时,我得到以下异常:
设置属性'System.Windows.Setter.Property'引发异常。 行号'..'和行位置'..'。“
我该如何解决这个问题?
答案 0 :(得分:1)
问题出现是因为您尝试将具有TargetType =“MyUC”的样式应用于UserControl类型的元素。
解决方案是从控件外部应用样式。例如,当您在另一个窗口中使用该控件时:
<Window.Resources>
<Style TargetType="local:MyUC">
<Setter Property="MyBackground" Value="Red" />
</Style>
</Window.Resources>
<Grid>
<local:MyUC />
</Grid>
作为测试,我将此代码添加到用户控件:
public partial class MyUC
{
public MyUC()
{
InitializeComponent();
}
public static readonly DependencyProperty MyBackgroundProperty =
DependencyProperty.Register("MyBackground", typeof(Brush), typeof(MyUC),
new PropertyMetadata(Brushes.White, PropertyChangedCallback));
private static void PropertyChangedCallback(DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
((MyUC)dependencyObject).MyBackgroundPropertyChanged(
(Brush)dependencyPropertyChangedEventArgs.NewValue);
}
private void MyBackgroundPropertyChanged(Brush newValue)
{
Background = newValue;
}
public Brush MyBackground
{
get { return (Brush)GetValue(MyBackgroundProperty); }
set { SetValue(MyBackgroundProperty, value); }
}
}
然后导致控件具有红色背景。