web-dev-qa-db-ja.com

WPFのボタンで別のページに移動する方法

Page2.xamlという名前で2つ目の.xamlページを設定しました。ボタンをクリックすると、ユーザーがPage2.xaml

私は私の内部のボタンにこれを持っていますPage1.xaml

<Grid>
    <Button x:Name="localModeBtn" 
            Style="{StaticResource MainButtonStyle}"  
            Content="local mode" 
            Click="localModeBtn_Click" />
</Grid>

そして、ボタンイベントハンドラについて:

private void localModeBtn_Click(object sender, RoutedEventArgs e)
    {
        Uri uri = new Uri("Page2.xaml", UriKind.Relative);
        this.NavigationService.Navigate(uri);
    }

ボタンをクリックすると、「リソースが見つかりませんpage2.xaml」というエラーが表示されますPage2.xamlは-と同じフォルダにありますPag1.xamlどこに問題があるのか​​わかりませんか?

11
galacticfan

私自身の質問への解決策:

私自身の質問に対する解決策を提供することは少しばかげていますが、Jastiのおかげで link コードを整理することができました。彼はコメントを投稿しただけだったので、それを回答としてマークすることはできません。そのため、これが解決策です。

NavigationWindowをWindowに変更して挿入しました。

<DockPanel>
    <Frame x:Name="_NavigationFrame" NavigationUIVisibility="Hidden" />
</DockPanel>

そして、追加したMainWindow.xaml.csのコンストラクター内で:

_NavigationFrame.Navigate(new Page1());

次に、ボタンイベントハンドラーを次のように調整しました。

this.NavigationService.Navigate(new Uri("Pages/Page2.xaml", UriKind.Relative));
18
galacticfan

あなたはこれを使うべきです、これは me のために働きました:

var Page2= new Page2(); //create your new form.
Page2.Show(); //show the new form.
this.Close(); //only if you want to close the current form.

variable typeソリューション内のpage.xaml正しい名前のページ。その後、そのメソッドを使用して機能的に実行する必要があります。

2
Milad Xandi

別のウィンドウが必要な場合

NavigationWindow navWIN = new NavigationWindow();
navWIN.Content = new pageWFbchAdmin();
navWIN.Show(); 
//winBchAdmin.ShowDialog();
0
paparazzo
private void Navigate_Click(object sender, RoutedEventArgs e)//By Prince Jain 
{
    this.NavigationService.Navigate(new Uri("Page3.xaml", UriKind.Relative));
}
0
Prince Jain

これにはC#コードは必要ありません。XMLで実行するだけです。

<Button Content="local mode"
    Command="NavigationCommands.GoToPage"
    CommandParameter="/Page2.xaml"/>

(再フォーマットされたコードはテストされていません)

0
lahjaton_j

私の解決策は、メインウィンドウにフレームを追加することでしたMainWindow.xaml

<Frame Name="Main" Content="" Margin="127,0,0,0" Background="#FFFFEDED" />

ナビゲーション用:

1-ボタンクリックでメインウィンドウから移動する:

private void Button_Click(object sender, RoutedEventArgs e)
{
   // navigate to pages/projects.xaml inside the main frame
   Main.Content = new MyProject.Pages.Projects();
}

2-フレーム内のページからのナビゲーションの場合ex Projects.xaml

// declare a extension method in a static class (its your choice if you want to reuse)
// name the class PageExtensions (you can choose any name)

namespace MyProject
{
    public static class PageExtensions
    {
        public static void NavigateTo(this Page page, string path)
        {
            Frame pageFrame = null;
            DependencyObject currParent = VisualTreeHelper.GetParent(page);

            while (currParent != null && pageFrame == null)
            {
                pageFrame = currParent as Frame;
                currParent = VisualTreeHelper.GetParent(currParent);
            }

            if (pageFrame != null)
            {
                pageFrame.Source = new Uri(path, UriKind.Relative);
            }
        }
    }
}


// to navigate from 'pages/projects.xaml' to another page
// heres how to call the extension on button click

this.NavigateTo("NewProject.xaml");

さらに、コンストラクターにパラメーターを渡す場合は、別のPageオブジェクトを必要とする別の拡張メソッドを追加できます。

// overloading NavigateTo
public static void NavigateTo(this Page page, Page anotherPage)
{
    Frame pageFrame = null;
    DependencyObject currParent = VisualTreeHelper.GetParent(page);

    while (currParent != null && pageFrame == null)
    {
        pageFrame = currParent as Frame;
        currParent = VisualTreeHelper.GetParent(currParent);
    }

    // Change the page of the frame.
    if (pageFrame != null)
    {
        pageFrame.Navigate(anotherPage);
    }
}

// usage
this.NavigateTo(new Pages.EditProject(id));
0
Ali Kleit

任意のコンテナーを使用して、コンテンツをビューモデルまたは分離コードの任意のプロパティにバインドします。その後、新しいページを設定してプロパティを更新し、PropertyChangedイベントを呼び出すだけです(INotifyPropertyChangedインターフェイスを参照)。これによりコンテナのコンテンツが更新され、必要なものをすべて表示できます。

0
Florian