使用generic.xaml中的Style Setter设置Control类型的属性崩溃VS.

时间:2011-05-26 15:51:33

标签: silverlight crash controls setter generic.xaml

在我的主控制样式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);
        }
    }
}

0 个答案:

没有答案