2009-10-18 6 views
0

У меня есть настраиваемая библиотека управления, в которой у меня есть несколько настраиваемых элементов управления, которые я использую в своем основном приложении. У меня есть простой пользовательский элемент управления, который позволяет пользователю выбирать значения толщины пера из выпадающего списка. Теперь я создаю новый настраиваемый элемент управления, основанный на списке, и я хочу включить выпадающее значение пера в элемент ItemTemplate нового пользовательского элемента управления.WPF: Ошибка использования настраиваемого элемента управления в ItemTemplate другого настраиваемого элемента управления

Я получаю эту ошибку:

«Невозможно создать экземпляр„LineThicknessComboBox“, определенной в сборке CustomControls ... Исключение было брошено в целью вызова ошибки в объекте.„10_T“в файле разметки . CustomControls; компонент/Темы/CustomListBox.General.xaml '

Вот XAML и код позади для LineThicknessComboBox:

namespace CustomControls 
{ 
    public class LineThicknessComboBox : ComboBox 
    { 
     public LineThicknessComboBox() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(LineThicknessComboBox) 
         , new FrameworkPropertyMetadata(typeof(LineThicknessComboBox))); 

     } 
    } 
} 

и LineThickne ssCombobox.Generic.xaml:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:CustomControls"> 

<Style TargetType="{x:Type local:LineThicknessComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}"> 
    <Setter Property="ItemTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       ... 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

</ResourceDictionary> 

Вот XAML и отделенного кода для моего нового CustomListBox:

namespace CustomControls 
{ 
    public class CustomListBox : ListBox 
    { 
     public CustomListBox() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomListBox) 
         , new FrameworkPropertyMetadata(typeof(CustomListBox))); 
     } 
    } 
} 

и CustomListBox.Generic.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:CustomControls"> 

<Style TargetType="{x:Type local:CustomListBox}" BasedOn="{StaticResource {x:Type ListBox}}"> 
    <Setter Property="ItemTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <Border> 
       ... 
        <local:LineThicknessComboBox /> 
       ... 
       </Border> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

</ResourceDictionary> 

А вот мой Generix.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="CustomControls;component/Themes/LineThicknessComboBox.Generic.xaml"/> 
     <ResourceDictionary Source="CustomControls;component/Themes/CustomListBox.Generic.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

Я думаю У меня есть какая-то ссылочная проблема, но я не могу понять, что не так. Программа компилируется и запускается без каких-либо предупреждений/ошибок, но когда CustomListBox создается в моем основном приложении, я получаю указанную выше ошибку. Не включая LineThicknessComboBox, CustomListBox отлично работает.

Может кто-нибудь объяснить, почему я получаю эту ошибку? Можно включить мой пользовательский элемент управления в другой, даже если они находятся в одной и той же пользовательской библиотеке управления, правильно?

Спасибо!

+0

"Исключение был брошен в адресат вызова." Просверлите InnerException (вам может потребоваться развернуть более одного уровня), и вы должны найти более значимое исключение.Это может сделать ошибку очевидной, как только вы ее увидите, или если вы ее опубликуете, это поможет в диагнозе. – itowlson

ответ

1

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

// not public LineThicknessComboBox() 
static LineThicknessComboBox()   
{ 
      DefaultStyleKeyProperty.OverrideMetadata(
       typeof(LineThicknessComboBox) 
         , new FrameworkPropertyMetadata(
           typeof(LineThicknessComboBox))); 
} 

Calls to OverrideMetadata should only be performed within the static constructors of the type that provides itself as the forType parameter of this method, or through similar instantiation. Attempting to change metadata after instances of the owner type exist will not raise exceptions, but will result in inconsistent behaviors in the property system.

ОТ MSDN

+0

Я сделаю это, когда вернусь домой сегодня. Спасибо за головы, я не уверен, почему мои конструкторы не объявлены статическими. – stevosaurus

+0

Это исправило мою проблему, спасибо Akash. – stevosaurus

0

У вас может возникнуть проблема с DesignMode и кодом в вашем конструкторе. Я не могу сказать наверняка, поскольку у меня была своя доля проблем с пользовательскими элементами управления WPF и поверхностью дизайна, и у всех из них есть загадочные ошибки, подобные этому.

Решение использовать класс System.ComponentModel.DesignerProperties, чтобы проверить, если вы находитесь в режиме разработки, и завернуть любой код, который не функционирует в режиме конструктора в если блок, чтобы предотвратить его запуск:

namespace CustomControls 
{ 
    public class LineThicknessComboBox : ComboBox 
    { 
     public LineThicknessComboBox() 
     { 
      // Design-mode capable code... 

      if (DesignerProperties.GetIsInDesignMode(this)) return; 

      // Design mode incapable code... 

      DefaultStyleKeyProperty.OverrideMetadata(typeof(LineThicknessComboBox) 
         , new FrameworkPropertyMetadata(typeof(LineThicknessComboBox))); 

     } 
    } 
} 
+0

Я не думаю, что это моя проблема, так как я получаю ошибку во время выполнения. Спасибо за ответ, хотя. – stevosaurus

Смежные вопросы