Создание множества пользовательских элементов управления в WP7 Silverlight приводит к странным исключениям

#.net #silverlight #xaml #windows-phone-7 #xamlparseexception

#.net #silverlight #xaml #windows-phone-7 #исключение xamlparseexception

Вопрос:

Я следовал руководству по созданию пользовательского элемента управления. Что я в основном сделал, так это создал новый проект, добавил файл CategoryBar.cs и каталог, вызываемый Themes с помощью file Themesgeneric.xaml (с типом компиляции, установленным в ‘resource’). Затем я написал класс CategoryBar.cs , пополнил generic.xaml ResourceDictionary. Давайте назовем этот проект «UILib»:

 <?xml version="1.0" encoding="utf-8" ?> 
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
                xmlns:local="clr-namespace:ErnestUILib">
    <Style TargetType="local:CategoryBar">
        <Setter Property="Background" Value="Black" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:CategoryBar">
                        <Grid x:Name="GridView" Background="{TemplateBinding Background}" Margin="0,0,0,8">
                            <!-- The grid rowdefs, coldefs and whatever makes up the grid -->
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
  

И все это работает совершенно нормально в проекте, где я добавляю ссылку на эту библиотеку. Я добавил атрибут xmlns:EULib="clr-namespace:UILib;assembly=UILib" в <phone:PhoneApplicationPage .. /> , и он работает нормально. Теперь я хотел реализовать другой элемент управления (поскольку я хочу иметь одну отдельную и ровно одну библиотеку для пользовательских элементов управления пользовательского интерфейса). Итак, теперь мой generic.xaml выглядит следующим образом:

 <?xml version="1.0" encoding="utf-8" ?> 
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
                xmlns:local="clr-namespace:ErnestUILib">
    <!-- THE NEW CUSTOM CONTROL -->
    <Style TargetType="local:PaginationBar">
        <Setter Property="Background" Value="Black" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:PaginationBar">
                        <Grid x:Name="GridView" Background="{TemplateBinding Background}" Margin="0,0,0,8">
                            <!-- The grid rowdefs, coldefs and whatever makes up the grid -->
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


    <!-- THE PREVIOUS CUSTOM CONTROL -->
    <Style TargetType="local:CategoryBar">
        <Setter Property="Background" Value="Black" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:CategoryBar">
                        <Grid x:Name="GridView" Background="{TemplateBinding Background}" Margin="0,0,0,8">
                            <!-- The grid rowdefs, coldefs and whatever makes up the grid -->
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
  

Здесь я создал класс PaginationBar в PaginationBar.cs , и все это настроено, но когда я пытаюсь использовать его в файле xaml моего приложения, в режиме конструктора отображается прямоугольник, заполненный белым, с крестиком в верхнем левом углу, и в нем говорится, что было вызвано исключение ‘Control_TargetTypeMismatch’. После нескольких моих уловок ничего по-прежнему не работало, но конструктор просто не загружается, когда я использую <UILib:PaginationBar .. /> , и вместо этого выдает ошибку System.Reflection.TargetInvocationException (Исключение было вызвано целью вызова). Когда я запускаю проект, он выдает ошибку XamlParseException. Это единственное исключение, из которого я могу извлечь некоторые детали, ни одна из которых, на мой взгляд, даже отдаленно не полезна. В любом случае, это то, что я получаю с помощью XamlParseException:XamlParseExceptionDetails

Я понятия не имею, как действовать дальше. Любая помощь приветствуется. Спасибо в ожидании 🙂

Ответ №1:

Убедитесь, что PaginationBar определен в том же пространстве имен: «clr-namespace:ErnestUILib». Также убедитесь, что вы установили правильный DefaultStyleKey в конструкторе вашего элемента управления:

  public PaginationBar ()
    {
        DefaultStyleKey = typeof(PaginationBar );
    }
  

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

1. На самом деле из-за некоторых проблем с тем, как я вводил текст, или бог знает чего, вопрос не отображался должным образом. На самом деле я разместил два разных набора кода. И во второй части я упомянул TargetType как ‘local:PaginationBar’. Большое вам спасибо за ответ, но не мог бы я побеспокоить вас перечитать мой вопрос теперь, когда я его правильно отредактировал? Я сожалею об этом 🙂

2. большое вам спасибо!! Оказывается, поскольку я копировал-вставлял код из предыдущего созданного мной элемента управления, я забыл изменить эту часть. P.S: Я создал оба элемента управления, следуя руководству из того самого блога, соучредителем которого вы являетесь. Хорошая работа! Приветствия 🙂