- 締切済み
URIでのページの移動について
visual C# 2010 Express を使用しています。 WPFでPage1.xamlとPage2.xamlを用意して Page1.xaml.cs内で private void button1_Click(object sender, RoutedEventArgs e) { this.NavigationService.Navigate(new Uri("./Page2.xaml")); } と記述し、ボタンをクリックしたのですが、次のような 「無効な URI: URI の形式を決定できませんでした。」 というエラーが出てしまいます・・・ たしかにPage2.xamlは存在するのですが、なぜこのようなエラーが出るのでしょうか? ちなみに this.NavigationService.Navigate(new Page2()); だとちゃんと移動できます。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Yune-Kichi
- ベストアンサー率74% (465/626)
Page系は使ったことが無かったのですが,テストプログラムを動作させてみたところ, LoadイベントでNavigationService.Sourceから取得することになります。 ただし,単純に引っ張ってはこれないので, nwe Uri(new Uri("http://www.example.com", UriKind.Absolute), NavigationService.Source.ToString()).Query でクエリ文字列を取得するようです。
- Yune-Kichi
- ベストアンサー率74% (465/626)
参考にされているページがWindows Phone 7用のページのようですが, Windows Phone 7で使われているのはWPFではなくSilverlightです。 基本的な考え方は同じなのですが,細かなところでWPFとSilverlightの間には差異があります。 # Browser PluginのSilverlightと,WP7のSilverlightに差異があるのも困りものなのですが……。 今回のNavigationContextについは,Silverlightのみに存在するプロパティおよびクラスになります。 このため,WPFで使うことはできません。 NavigationService.SourceでUriが取得できるので, QueryStringプロパティをとおして値を取得することになると思います。
お礼
ご回答ありがとうございます。 なるほど、Silverlightですか。。 自分は聞いたことはあるのですが、どういうものか大雑把に想像はつきますが よくはわからないですね・・・ 一応、次のように試してみたのですが、 try { string inputVal = ""; inputVal = NavigationService.Source.Query.ToString(); } catch (Exception e) { MessageBox.Show(e.Message); } 「オブジェクト参照がオブジェクトインスタンスに設定されていません」 というエラーが出てきてしまいます・・・ NavigationService.SourceでQueryStringプロパティがなかったので(インテリセンスで現れない) のでこのような処理にしたのですが、どのように記述するべきなのでしょうか? 一応 [Page1.xaml.cs]側で Application.Current.Properties["msg1"] = "aaaa"; [Page2.xaml.cs]側で MessageBox.Show(Application.Current.Properties["msg1"].ToString()); これなら受け渡しをすることができたのですが、 本題のようにリンクのパラメーターで受け渡しをしたいです。
- Yune-Kichi
- ベストアンサー率74% (465/626)
MSDN: Uri コンストラクター (String) (System) http://msdn.microsoft.com/ja-jp/library/z6c2z492.aspx のUriFormatExceptionの例に,色々書いてありますし,解説には, 「このコンストラクターは、string パラメーター参照が絶対 URI であることが前提となっており、UriKind を Absolute に設定して Uri コンストラクターを呼び出すのと同じ結果になります。」 と書いてあります。 今回の場合,絶対Uriではなく相対Uriなので, this.NavigationService.Navigate(new Uri("./Page2.xaml", UriKind.Relative)); もしくは, this.NavigationService.Navigate(new Uri("./Page2.xaml", UriKind.RelativeOrAbsolute)); とする必要があります。
お礼
ご回答ありがとうございます。 それを試してみましたが、できました。 ありがとうございます。 それで今気づいたのですが、自分は this.NavigationService.Navigate(new Uri("./Page2.xaml"), UriKind.RelativeOrAbsolute); で試していました・・・見間違いでした。。 それともう一つ疑問があるのですが、次のようにパラメータにメッセージを付加したいと思い、 this.NavigationService.Navigate(new Uri("./Page2.xaml?msg1=aa", UriKind.RelativeOrAbsolute)); Page2.caml.cs側で、 public Page2() { InitializeComponent(); string inputVal = ""; if (NavigationContext.QueryString.TryGetValue("msg1", out inputVal)) { } } と記述したのですが、コンパイルの時点で 「名前 'NavigationContext' は現在のコンテキスト内に存在しません。」 というエラーが出てしまいます・・・ Page2.caml.csにはちゃんとusing System.Windows.Navigation;を記述しているのですが、 何が足りないのでしょうか? http://techbooster.jpn.org/andriod/9517/
お礼
ご回答ありがとうございます。 なるほど、結構複雑ですね。参考になりました。 ただ試してみたのですが、自分の環境ではどうもうまくいかないですね・・・ そこで [Page1.xaml] <Hyperlink RequestNavigate="Page_RequestNavigate" NavigateUri="Page2.xaml" Name="n1">Page2</Hyperlink> [Page1.xaml.cs] private void Page_RequestNavigate(object sender, RequestNavigateEventArgs e) { Application.Current.Properties["msg1"] = "ここにメッセージを入れる"; } [Page2.xaml.cs] MessageBox.Show(Application.Current.Properties["msg1"].ToString()); でなんとかメッセージを得ることができました。。 すいません、もう一つ質問があるのですが、 [Page1.xaml]に次のように記述すると <Grid> <Hyperlink RequestNavigate="Page_RequestNavigate" NavigateUri="Page2.xaml" Name="n1">Page2</Hyperlink> <Run Text=" | " /> <Hyperlink RequestNavigate="Page_RequestNavigate" NavigateUri="Page2.xaml" Name="n2">Page2</Hyperlink> </Grid> 「型'Hyperlink'の値は、型'UIElementCollection'のコレクションまたは辞書に追加されません」 というエラーが出てしまいます・・・ <TextBlock> <Hyperlink RequestNavigate="Page_RequestNavigate" NavigateUri="Page2.xaml" Name="n1">Page2</Hyperlink> <Run Text=" | " /> <Hyperlink RequestNavigate="Page_RequestNavigate" NavigateUri="Page2.xaml" Name="n2">Page2</Hyperlink> </TextBlock> これなら大丈夫なのですが、これはどういうエラーなのでしょうか? 回避するというか<Grid>内では使えないのでしょうか?