динамические данные датируют события Silverlight - PullRequest
1 голос
/ 10 февраля 2009

Поиск информации о том, как подключить события к DataTemplate для silverlight, используя только код. Это приведет к сбою моего браузера при визуализации.

private DataTemplate Create(Type type)        
{            
  DataTemplate dt = new DataTemplate();            
  string xaml = "<DataTemplate x:Name='dt' xmlns='http://schemas.microsoft.com/client/2007' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns:basics='clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls'  >"
                + "<Border Height='135' Width='110' HorizontalAlignment='Left' VerticalAlignment='Top' Background='#7FFCFAFA' CornerRadius='5,5,5,5'>"
                + "<StackPanel Orientation='Vertical' Width='110' Height='135'>"
                + "<Image Source='{Binding Path=ThumbnailPath}' Width='64' Height='64' Margin='5'  HorizontalAlignment='Left' />"
                + "<TextBlock Text='{Binding Path=Title}' Margin='5' FontFamily='Verdana' HorizontalAlignment='Left' TextWrapping='Wrap' Foreground='#FFFAF8F8' Width='100' FontSize='9' />"
                + "<TextBlock Text='{Binding Path=FileDuration}' Margin='5' FontFamily='Verdana' HorizontalAlignment='Left' Foreground='#FFFAF8F8' Width='100' FontSize='9'/>"
                + "<StackPanel Orientation='Horizontal' Background='{x:Null}' x:Name='GridMenuBar'>"
                + "<Button ClickMode='Press' x:Name='play_buttons' HorizontalAlignment='Left' Template='{StaticResource GlassPlay}'  BorderBrush='{x:Null}' Foreground='#FFF9F7F7' Background='{x:Null}' />"
                //+ "<Button Height='Auto' HorizontalAlignment='Left' VerticalAlignment='Top' Width='Auto' Content='Button' x:Name='addPlayListItemButton' Template='{StaticResource GlassAddPlaylist}' Click='addPlayListItemButton_Click' />"
                + "</StackPanel>"
                + "</StackPanel>"
                + "</Border>"
                + "</DataTemplate>"; 
    dt = (DataTemplate)XamlReader.Load(xaml);
    return dt;
}

1 Ответ

4 голосов
/ 11 февраля 2009

Какое исключение вы получаете? Вы можете найти его, посмотрев на значок ошибки скрипта в строке состояния вашего браузера. Если вы не имеете в виду, что это на самом деле полностью убивает процесс браузера. Этого не должно быть, но если это произойдет, вы можете подключить Visual Studio к процессу браузера, прежде чем перейти на страницу.

Теперь у меня есть несколько догадок о том, в чем проблема. Прежде всего, вы ссылаетесь на некоторые компоненты в вашем шаблоне, которые существуют только в пределах области страницы. Например, ваша кнопка ссылается на статический шаблон «GlassPlay», а также (хотя и закомментированный) ссылается на обработчик addPlayListItemButton_Click, который будет находиться в выделенном фрагменте кода. У XamlReader нет контекста, чтобы понять, куда эти вещи подключать.


Просто внутренний совет, пользовательские элементы управления не загружают себя с помощью XamlReader, а вместо этого загружают с помощью Application.LoadComponent. У LoadComponent есть некоторая область действия, но он по-прежнему ожидает, что вся разметка будет загружена как единое целое, и ожидает, что все это будет получено из URI ресурса (нет способа загрузить из строки).


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

Обработчик кликов - ваша самая большая проблема. Не пытайтесь назначить обработчик в разметке. Вместо этого дайте кнопке имя и используйте FindName на экземпляре шаблона после его загрузки, чтобы удержать кнопку. Оттуда вы можете подписаться на события в коде.

Надеюсь, это поможет.

...