#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.