wodehuajianrui

博客园 首页 新随笔 联系 订阅 管理

出于安全因素的考虑,Silverlight应用程序并不能过多的访问本地资源,比如说它只有openFileDialog而没有saveFileDialog,另外SilverLight也不能直接操作Windows剪切板。

 

在我们设计Form程序的时候,时常要用到剪切板资源,在.net下,只要操作System.Windows.ClipBoard类下的各个静态方法就能过实现我们的需求。但是SilverLight程序集作为WPF的一个子集,并没有ClipBoard这个类。但是如果我们想在SilverLight中访问剪切板资源的话,就要另辟蹊径。由于SilverLight中有与asp.net以及HTML DOM交互的机制,因此我们大可以通过这种途径来实现SilverLight访问剪切板的目的。

 

 

    <script type="text/javascript">               
        
function copyToClipBoard() {
            
if (arguments.length > 0{
                window.clipboardData.setData(
"abcd", arguments[0]);               
            }

        }

    
</script>

在HTML和aspx文件(调用SilverLight程序xap的载体)中,添加这段js代码,然后改写app.xaml.cs文件如下:

 

        public App()
        
{
            
this.Startup += this.Application_Startup;
            
this.Exit += this.Application_Exit;
            
this.UnhandledException += this.Application_UnhandledException;

            InitializeComponent();
        }


        
private void Application_Startup(object sender, StartupEventArgs e)
        
{
            Page p 
= new Page();
            System.Windows.Browser.HtmlPage.RegisterScriptableObject(
"SilverlightApplication", p);
            
this.RootVisual = p;
        }

 

同时,在Page.xaml.cs文件中加入相应的代码:

 

        private void CopyToClipBoard()
        
{
            HtmlPage.Window.Eval(
"copyToClipBoard()");
            Object[] args 
= {"abcdefg");
            HtmlPage.Window.Invoke(
"copyToClipBoard", args);
        }

        [ScriptableMember()]
        
public string InterInvole()
        
{            
            
return "你从js脚本中调用了 Silverlight 方法";
        }

 

这样,每当Page.xaml.cs中的CopyToClipBoard()方法被调用,abcdefg这个字符串就会被复制到剪切板。

 

PS:上面那段[ScriptableMember()]其实我没有调用过它,只是SilverLight要求在与js的交互中提供给js调用的接口而已,不写的话编译是通不过的。

PS:在Vista中运行的话,系统会提示是否同意访问剪切板,这是Vista的问题,并不是这段代码的错。

posted on 2008-07-22 12:31  花间蕊  阅读(666)  评论(0编辑  收藏  举报