none
WPF 浏览器应用程序,打开新页面 RRS feed

  • 问题

  •  

    我用VisualStudio2008创建 WPF 浏览器应用程序。我在IE7中运行该程序。有两个页面:Page1和Page2。在Page1上有一个Button,我希望用户按下这个Button,后,IE能在一个新打开的页面上显示Page2,而不是将现有的Page1导航到Page2。如果是导航,我用NavigationService.Navigate()就能实现,但是这样不是在新的页面中打开Page2,不符合我的要求。

    还有,如果我在Page1上有一个Hyperlink,我希望鼠标点击该链接后,IE能用一个新页面打开Page2,我用如下脚本:

    <Hyperlink Name="hyperlink_page2" NavigateUri="Page2.xaml" TargetName="_blank">Page2</Hyperlink>

    我设置了TargetName属性,运行时系统报错,抛出异常:

    未处理 System.InvalidOperationException
    Message: 无法导航至 Web 浏览器中的应用程序资源“pack://application:,,,/TestWpfBrowserApp;component/Page2.xaml”。
    如果我不设置TargetName属性,则能正常运行,但是运行的结果是将当前的Page1页面导航到Page2页面,而不是打开新页面。

    请问,我如何用以上两种方式打开新页面?

    2008年10月9日 6:14

答案

  • 你好,

    这个比较麻烦,首先先解决你的第一个问题,开个新窗口显示Page2.xaml:

    App.xaml.cs:

     public partial class App : Application
        {
            public App()
            {
                this.Startup += new StartupEventHandler(App_Startup);
            }

            void App_Startup(object sender, StartupEventArgs e)
            {
                if (ApplicationDeployment.CurrentDeployment != null && ApplicationDeployment.CurrentDeployment.ActivationUri != null)

                { string s=ApplicationDeployment.CurrentDeployment.ActivationUri.Query;
                    if(s.StartsWith("?page=")&&!s.Contains("&"))
                {
                    this.StartupUri = new Uri("pack://application:,,,/WpfBrowserApplication1;component/" + s.Substring(6));
                }
                }
            }
        }

     

    还要做一些设置,参考:

    http://learnwpf.com/Posts/Post.aspx?postId=dec2f67d-b80f-4773-ba02-35506b2250e9

     

    Page1.xaml.cs:

    namespace WpfBrowserApplication1
    {
        /// <summary>
        /// Interaction logic for Page1.xaml
        /// </summary>
        public partial class Page1 : Page
        {
            public Page1()
            {
                InitializeComponent();
              
               
            }

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                Form f = new Form();
                f.Show();
            }

          
        }
    }

     

    Page1.xaml:

    <Page x:Class="WpfBrowserApplication1.Page1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Page1">
        <Grid>
            <StackPanel>
                <Button Click="Button_Click" Width="20" Height="20"></Button>
                <TextBlock Margin="0,0,8,8"

               VerticalAlignment="Bottom"

               HorizontalAlignment="Right">

      <Hyperlink NavigateUri="http://microsof-5b21ab/W1/WpfBrowserApplication1.xbap?page=Page2.xaml" TargetName="_blank">

       Open

      </Hyperlink>

    </TextBlock>
            </StackPanel>
           

        </Grid>
    </Page>

    这个技巧是利用querystring来选择初始页面.

     

    对于第二个问题,上面代码也写了,就是生成一个Form实例,然后show一下.

    2008年10月10日 7:18
    版主

全部回复

  • 你好!
       我在其他版块回答过了,你试试,要是不行,我们在讨论。
    2008年10月9日 7:13
    版主
  • 你好,我已经收到你的答复,谢谢你的帮助。但是,你的答案并不是我想要的。你的答案涉及到进程。很明显的一个缺陷,它要启动IE的进程,这样做不具备可移植性。如果我用Firefox来运行程序呢?如果用TT浏览器呢?如果用别的浏览器呢?

    我相信微软.NET一定有更方便更通用的解决方案,只是我们没有找到而已。

    2008年10月9日 7:18
  • 你好!
       你的意思是不是想在不知道用户使用什么浏览器的情况下,也能在新的浏览器窗口中打开页面。
       我的看法是这样的:
       1,首先,你想在新的浏览器窗口中打开页面不可避免要使用新的进程。
       2,如果不知道使用什么浏览器的情况下,就不能知道启动什么进程。
       这个功能的一般做法是按照原浏览器的种类启动新的窗口。
       以上是我个人的看法,你如果有好的方法,我们再讨论。
    2008年10月9日 7:35
    版主
  • 如果地址是一般的 网页,TargetName="_blank",那样就已经可以了
    2008年10月9日 7:40
    版主
  • 我在我的问题描述中提到,我是用IE浏览器来运行程序的,如果是设置了TargetName="_blank“属性,系统运行到这里就报错。异常信息我在问题描述中提到。如果不设置该属性,则不报错,但是不会打开新页面

    2008年10月9日 7:44
  • 我希望实现像HTML中 <a href="..." target="_blank">href</a>的这种效果。这可不需要设计到什么进程的吧。

    还有,我顺便再提一个问题。我能不能在 WPF浏览器应用程序 中弹出一个Window或者Form?这样就可以让用户在新窗体上进行操作,不用在浏览器承载的界面里操作了。

    2008年10月9日 7:47
  • 你好,

    这个比较麻烦,首先先解决你的第一个问题,开个新窗口显示Page2.xaml:

    App.xaml.cs:

     public partial class App : Application
        {
            public App()
            {
                this.Startup += new StartupEventHandler(App_Startup);
            }

            void App_Startup(object sender, StartupEventArgs e)
            {
                if (ApplicationDeployment.CurrentDeployment != null && ApplicationDeployment.CurrentDeployment.ActivationUri != null)

                { string s=ApplicationDeployment.CurrentDeployment.ActivationUri.Query;
                    if(s.StartsWith("?page=")&&!s.Contains("&"))
                {
                    this.StartupUri = new Uri("pack://application:,,,/WpfBrowserApplication1;component/" + s.Substring(6));
                }
                }
            }
        }

     

    还要做一些设置,参考:

    http://learnwpf.com/Posts/Post.aspx?postId=dec2f67d-b80f-4773-ba02-35506b2250e9

     

    Page1.xaml.cs:

    namespace WpfBrowserApplication1
    {
        /// <summary>
        /// Interaction logic for Page1.xaml
        /// </summary>
        public partial class Page1 : Page
        {
            public Page1()
            {
                InitializeComponent();
              
               
            }

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                Form f = new Form();
                f.Show();
            }

          
        }
    }

     

    Page1.xaml:

    <Page x:Class="WpfBrowserApplication1.Page1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Page1">
        <Grid>
            <StackPanel>
                <Button Click="Button_Click" Width="20" Height="20"></Button>
                <TextBlock Margin="0,0,8,8"

               VerticalAlignment="Bottom"

               HorizontalAlignment="Right">

      <Hyperlink NavigateUri="http://microsof-5b21ab/W1/WpfBrowserApplication1.xbap?page=Page2.xaml" TargetName="_blank">

       Open

      </Hyperlink>

    </TextBlock>
            </StackPanel>
           

        </Grid>
    </Page>

    这个技巧是利用querystring来选择初始页面.

     

    对于第二个问题,上面代码也写了,就是生成一个Form实例,然后show一下.

    2008年10月10日 7:18
    版主
  •  

    Allen Chen 你好,谢谢你给我的答复。关于那个打开Form的问题,我尝试过,会抛出安全性异常的。我是不是要对浏览器做一些设置,才能让Form.Show()能正常执行?我应该作什么设置呢?
    2008年10月10日 7:52
  • 你用的是Form还是Window?能做一个测试的项目然后发出来看看吗?

    2008年10月10日 8:17
    版主
  • 谢谢 Allen Chen ,我原先尝试弹出一个Window,是抛了安全性异常,这次我尝试弹出Form,没有问题。我想请教一下,如果我在Form中,比如,在一个Button的Click事件中,尝试数据库连接操作,会不会有安全性问题?

    还有能不能留个MSN,方便联系?我的:compufanwuyu@hotmail.com

    我用.NET和JAVA都开发过项目,WPF对我来说是一个新的技术。我感觉WPF浏览器应用程序类似于Java Applet。因此,我对WPF很感兴趣,希望能得到你的指导,谢谢。

    2008年10月10日 8:22
  • 你好,

     

    我建议你不要直接连接数据库,这不是一个很好的方式.(如果要调用,右键项目,设置Security->Permission,或者设置为full trust)

     

    比较好的架构是通过调用Web Service来解决.

     

    另外我建议你可以看一下Silverlight, Silverlight是跨平台的,这一点比XBAP有优势. 关于调用web service来访问数据库,可以参考下面文章,它是关于Silverlight,不过对XBAP也是类似的.

    http://silverlight.net/learn/tutorials/sqldatagrid.aspx

    2008年10月10日 8:37
    版主
  • 谢谢 Allen Chen ,你给我的答复非常有帮助。我在 "设置Security->Permission"之前,进行数据库操作,果然是抛出了安全性异常。我会尝试WEB SERVICE方式的。那我可以用Remoting方式吗?会有安全方面的问题吗?

    2008年10月10日 8:46
  • 应该也会有问题.还是建议你使用Web Service, SOA是将来的趋势.

    2008年10月10日 8:49
    版主