动态datatemplate silverlight事件

时间:2009-02-10 06:23:55

标签: c# silverlight events datatemplate

查找有关如何仅使用代码将事件挂接到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 个答案:

答案 0 :(得分:4)

你得到什么样的例外?您可以通过查看浏览器状态栏中的脚本错误图标找到它。除非你的意思是这实际上完全杀死了浏览器进程。这不应该发生,但如果确实如此,您可以在导航到页面之前将Visual Studio附加到浏览器进程。

现在,我有几个猜测是什么问题。首先,您正在引用模板中仅存在于页面范围内的某些组件。例如,您的按钮引用静态模板“GlassPlay”,它也(虽然已注释掉)引用处理程序addPlayListItemButton_Click,它将驻留在代码隐藏中。 XamlReader没有上下文来理解在哪里连接这些东西。


只是一个内部提示,用户控件不使用XamlReader加载自己,而是使用Application.LoadComponent加载。 LoadComponent确实有一些范围,但它仍然希望所有标记都作为一个单元加载,并且期望它全部来自资源URI(无法从字符串加载)。


可以使用动态数据模板,甚至可以在模板外部引用资源。我知道这在WPF中有效,并且在将模板添加到可视树时解析资源。我不是肯定的,在Silverlight中工作,但我很确定它确实如此。

点击处理程序是您最大的问题。不要尝试在标记中分配处理程序。相反,为按钮命名并在加载后使用模板实例上的FindName来保持按钮。从那里您可以订阅代码中的事件。

希望有所帮助。