在我的主控制样式generic.xaml中,我正在尝试设置我的主控件的属性的默认值(此属性的类型为Control),但这会导致VS 2010在使用MyMainControl时崩溃设计观点。使用下面的代码可以看到问题。我正在使用Silverlight 4.我还尝试将MyControl指定为资源(如下面的代码中所示),这也导致VS 2010在使用MyMainControl时崩溃。
我发现如果我在MyControl构造函数中删除“DefaultStyleKey = typeof(MyControl)”,那么问题就不会发生(但MyControl的样式不适用于它,控件看起来不正确)。
这里的主要目标是我需要允许MyMainControl类可选地创建MyControl类的实例,以在MyMainControl类的实例化期间将MyControl属性设置为。默认情况下,我希望将MyControl属性设置为MyControl的实例,但我希望用户能够在其XAML中为MyControl属性指定null(或指定具有不同设置的MyControl实例),如果他们这样做,我希望MyControl的默认内部实例化不会发生(为了提高MyMainControl的效率)。
我最初在MyMainControl的构造函数中创建了MyControl实例,但是如果用户在其MyMainControl XAML中将MyControl属性设置为null,则MyControl的实例仍然在内部不必要地创建(然后用null覆盖),这导致更糟糕的表现(不仅仅是使用null而不是在内部创建MyControl)。
在WPF中,我能够将MyControl指定为资源,然后在generic.xaml MyMainControl样式中,我能够将MyControl属性设置为MyControl类的实例,这极大地提高了性能。如果用户将MyControl设置为null,则为MyMainControl。但是我无法在Silverlight中使用它。
总结,主要的想法是,如果我可以使用MyMainControl样式为MyControl属性指定默认值,那么用户将能够指定他们自己的MyMainControl样式可以为MyControl属性指定null值或具有不同设置的MyControl实例 - 并且因为他们的MyMainControl样式将替换我的,所以我在MyMainControl样式中指定的MyControl的默认实例化将不会发生。
我非常感谢任何人可以提供的有关如何在Silverlight中完成此任务的帮助!
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyNamespace"
>
<Style TargetType="local:MyControl">
<Setter Property="Opacity" Value="1" />
</Style>
<!-- Note: I tried specifying my control as a resource
(so I could in the MyMainControl style set the property to
the MyControl StaticResource), but include this line of XAML
causes VS 2010 to crash when using my main control.
<local:MyControl x:Key="MyControl" />-->
<Style TargetType="local:MyMainControl">
<Setter Property="MyControl" >
<Setter.Value>
<local:MyControl />
</Setter.Value>
</Setter>
</Style>
MyControl是一个非常简单的类,派生自Control:
public class MyControl : Control
{
public MyControl()
{
DefaultStyleKey = typeof(MyControl);
}
}
MyMainControl MyControl DependencyProperty的代码是:
public partial class MyMainControl : Control
{
...
public static readonly DependencyProperty MyControlProperty = DependencyProperty.Register("MyControl", typeof(MyControl), typeof(MyMainControl), new PropertyMetadata(null));
public MyControl MyControl
{
get
{
return (MyControl)GetValue(MyControlProperty);
}
set
{
SetValue(MyControlProperty, value);
}
}
}