1

在 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 指定为资源,然后在 MyMainControl 的 generic.xaml 样式中,我可以将 MyControl 属性设置为 MyControl 类的实例,如果用户将 MyControl 设置为 null。但我无法在 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);
        }
    }
}
4

0 回答 0