1

寻找有关如何仅使用代码将事件挂钩到 Silverlight 的 DataTemplate 的信息。这会使我的浏览器在渲染时崩溃。

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;
}
4

1 回答 1

4

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

现在,我对问题所在有一些猜测。首先,您在模板中引用了一些仅存在于页面范围内的组件。例如,您的按钮引用了一个静态模板“GlassPlay”,并且它(尽管已注释掉)还引用了一个处理程序 addPlayListItemButton_Click,该处理程序将驻留在代码隐藏中。XamlReader 没有上下文来了解在哪里连接这些东西。


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


动态数据模板是可能的,甚至引用模板之外的资源也应该没问题。我知道这在 WPF 中有效,并且在将模板添加到可视化树时会解析资源。我不肯定它在 Silverlight 中有效,但我很确定它确实有效。

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

希望有帮助。

于 2009-02-11T19:50:47.147 回答