Использование установщика стиля в generic.xaml для установки свойства элемента управления типом приводит к сбоям VS

#silverlight #crash #controls #setter #generic.xaml

#silverlight #сбой #элементы управления #установщик #generic.xaml

Вопрос:

В моем основном стиле управления в generic.xaml я пытаюсь установить значение по умолчанию для свойства моего основного элемента управления (и это свойство относится к типу Control), но это приводит к сбою VS 2010 при использовании MyMainControl в режиме конструктора. Проблему можно увидеть, используя приведенный ниже код. Я использую Silverlight 4. Я также попытался указать MyControl в качестве ресурса (как показано в коде ниже с комментариями), и это также привело к сбою VS 2010 при использовании MyMainControl.

Я обнаружил, что если я удаляю «DefaultStyleKey = typeof(MyControl)» в конструкторе MyControl, то проблема не возникает (но тогда стиль MyControl к нему не применяется, и элемент управления выглядит неправильно).

Основная цель здесь заключается в том, что мне нужно разрешить классу MyMainControl при необходимости создавать экземпляр класса MyControl для установки свойства MyControl на значение во время создания экземпляра класса MyMainControl. По умолчанию я хочу, чтобы свойству MyControl было присвоено значение экземпляра MyControl, но я хочу, чтобы пользователь мог указать null (или указать экземпляр MyControl с другими настройками) для свойства MyControl в своем XAML, и если они это сделают, я хочу, чтобы внутреннее создание экземпляра MyControl по умолчанию не выполнялось (в целях повышения эффективности MyMainControl).

Изначально я создал экземпляр MyControl в конструкторе MyMainControl, но если пользователь устанавливает для свойства MyControl значение null в своем MyMainControl XAML, экземпляр MyControl по-прежнему создается без необходимости внутри (а затем перезаписывается null), что приводит к гораздо более низкой производительности (чем просто использование null и не создание MyControl внутри).

В WPF я могу указать MyControl в качестве ресурса, а затем в стиле MyMainControl generic.xaml я могу присвоить свойству MyControl значение экземпляра класса MyControl, что значительно улучшило производительность MyMainControl, если пользователь устанавливает для MyControl значение null. Но я не смог заставить то же самое работать в Silverlight.

Подводя итог, основная идея заключается в том, что если я могу использовать стиль MyMainControl для указания значения по умолчанию для свойства MyControl, то пользователь сможет указать свой собственный стиль MyMainControl, в котором он может указать для свойства MyControl значение null или экземпляр MyControl с другими настройками — и поскольку их стиль MyMainControl заменит мой, то создание экземпляра MyControl по умолчанию, который я указываю в своем стиле MyMainControl, не произойдет.

Я очень ценю любую помощь, которую кто-либо может оказать относительно того, как это можно сделать в 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);
        }
    }
}
  

Комментарии:

1. Как MyControl используется MyMainControl? Это отображается или просто используется в коде?

2. В обработчике события OnMouseRightButtonUp от MyMainControl, если MyMainControl. Свойство MyControl не равно null, создается новый экземпляр MyControl, а настройки сохраняются в MyMainControl. Свойства MyControl копируются в новый экземпляр MyControl, и отображается новый экземпляр MyControl.