質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

2回答

1516閲覧

C# Windowにボタンを付けてもエラーが出ないようにしたい

chatya

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2020/03/16 13:27

前提・実現したいこと

C#の勉強をしている者です
Main Window のbuttonを押すとWindow 1を開き、Main Windowを隠す
Window 1のbuttonを押すとMain Windowを開き、Window 1を隠す
というようなプログラムを作りたいのですが、Window 1にボタンを置いて実行するとエラーが出てしまいます

該当のソースコード(Main Window)

C#

1Main window 2 3using System; 4using System.Collections.Generic; 5using System.Linq; 6using System.Text; 7using System.Threading.Tasks; 8using System.Windows; 9using System.Windows.Controls; 10using System.Windows.Data; 11using System.Windows.Documents; 12using System.Windows.Input; 13using System.Windows.Media; 14using System.Windows.Media.Imaging; 15using System.Windows.Navigation; 16using System.Windows.Shapes; 17 18namespace プログラム名 19{ 20 /// <summary> 21 /// MainWindow.xaml の相互作用ロジック 22 /// </summary> 23 public partial class MainWindow : Window 24 { 25 public MainWindow() 26 { 27 InitializeComponent(); 28 } 29 30 private void Button_Click(object sender, RoutedEventArgs e) 31 { 32 var window = new Window1(); 33 window.Show(); 34 this.Hide(); 35 } 36 } 37}

該当のソースコード(Window1)

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Windows; 7using System.Windows.Controls; 8using System.Windows.Data; 9using System.Windows.Documents; 10using System.Windows.Input; 11using System.Windows.Media; 12using System.Windows.Media.Imaging; 13using System.Windows.Shapes; 14 15namespace プログラム名 16{ 17 /// <summary> 18 /// Window1.xaml の相互作用ロジック 19 /// </summary> 20 public partial class Window1 : Window 21 { 22 public Window1() 23 { 24 InitializeComponent(); 25 } 26 27 private void Button_Click(object sender, RoutedEventArgs e) 28 { 29 30 } 31 } 32} 33

補足情報(FW/ツールのバージョンなど)

visual studio2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/03/16 13:45

エラーが出るところが書かれていませんが。
gentaro

2020/03/16 15:46

回答はすでについているもので問題ないと思いますが、ガイドラインを読んでもうちょい頑張って質問を書きましょう。「エラーが出ます」だけ書かれてもエラーの詳細を提示されないと答えようのない場合があるので。 https://teratail.com/help/question-tips
guest

回答2

0

毎回newするパターン(Window1)と、
Show Hideするだけのパターン(Window2)の両方用意しました。

MainWindowの取得方法もいろいろ考えられますが、手間が少なそうな方法にしました。

×ボタンや終了時の処理等、地味に罠があります。

MainWindow

xml

1<Window 2 x:Class="Questions247571.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Title="MainWindow" 6 Width="800" 7 Height="450"> 8 <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 9 <Button 10 Margin="10" 11 Click="Window1Button_Click" 12 Content="Window1へ" /> 13 <Button 14 Margin="10" 15 Click="Window2Button_Click" 16 Content="Window2へ" /> 17 </StackPanel> 18</Window>

cs

1using System.Windows; 2 3namespace Questions247571 4{ 5 public partial class MainWindow : Window 6 { 7 // こうだと Application.Current.MainWindow がWindow2になってしまうためNG 8 //private Window2 window2 = new Window2(); 9 private Window2 window2; 10 11 public MainWindow() 12 { 13 InitializeComponent(); 14 15 // Window2は閉じないのでデフォルト(OnLastWindowClose)だとアプリが終わらなくなる 16 // MainWindowのCloseでアプリも終了 17 // App.xamlで指定してよい 18 Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose; 19 20 window2 = new Window2(); 21 } 22 23 private void Window1Button_Click(object sender, RoutedEventArgs e) 24 { 25 var window1 = new Window1(); 26 window1.Show(); 27 this.Hide(); 28 } 29 private void Window2Button_Click(object sender, RoutedEventArgs e) 30 { 31 window2.Show(); 32 this.Hide(); 33 } 34 } 35}

Window1

xml

1<Window 2 x:Class="Questions247571.Window1" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Title="Window1" 6 Width="800" 7 Height="450"> 8 <Grid> 9 <TextBox Text="文字を書き換えてみよう&#xa;毎回新しく作るので状態は保存されない" /> 10 <Button 11 HorizontalAlignment="Center" 12 VerticalAlignment="Center" 13 Click="Button_Click" 14 Content="MainWindowへ" /> 15 </Grid> 16</Window>

cs

1using System.ComponentModel; 2using System.Windows; 3 4namespace Questions247571 5{ 6 public partial class Window1 : Window 7 { 8 public Window1() => InitializeComponent(); 9 10 private void Button_Click(object sender, RoutedEventArgs e) 11 { 12 // OnClosingへ 13 // ×ボタンで閉じるとき等とまとめて処理 14 this.Close(); 15 } 16 protected override void OnClosing(CancelEventArgs e) 17 { 18 base.OnClosing(e); 19 20 Application.Current.MainWindow.Show(); 21 // このあと閉じる 22 } 23 } 24}

Window2

xml

1<Window 2 x:Class="Questions247571.Window2" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Title="Window2" 6 Width="800" 7 Height="450"> 8 <Grid> 9 <TextBox Text="文字を書き換えてみよう&#xa;非表示になってるだけなので状態は保存される" /> 10 <Button 11 HorizontalAlignment="Center" 12 VerticalAlignment="Center" 13 Click="Button_Click" 14 Content="MainWindowへ" /> 15 </Grid> 16</Window>

cs

1using System.ComponentModel; 2using System.Windows; 3 4namespace Questions247571 5{ 6 public partial class Window2 : Window 7 { 8 public Window2() => InitializeComponent(); 9 10 private void Button_Click(object sender, RoutedEventArgs e) 11 { 12 // OnClosingへ 13 // ×ボタンで閉じるとき等とまとめて処理 14 this.Close(); 15 } 16 protected override void OnClosing(CancelEventArgs e) 17 { 18 base.OnClosing(e); 19 20 // アプリ終了時に NullReferenceException が出るので ?. にしておく 21 Application.Current.MainWindow?.Show(); 22 this.Hide(); 23 24 // 閉じないようにキャンセル 25 e.Cancel = true; 26 } 27 } 28}

個人的にはWindowを次々出すより、Pageとして作成しMainWindow内で入れ替えるような作りが好みです。

投稿2020/03/18 22:23

編集2023/07/21 08:54
TN8001

総合スコア9326

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chatya

2020/03/19 03:32

Mainwindow・Window1を書き終わってから実行すると次のようなエラーが出てきます どうしたらよいのでしょうか ※Name spaceの部分は変えています ファイル "obj\Debug\WpfApp3.exe" を "bin\Debug\WpfApp3.exe" にコピーできません。別のプロセスで使用されているため、プロセスはファイル 'bin\Debug\WpfApp3.exe' にアクセスできません。 WpfApp3 "obj\Debug\WpfApp3.exe" を "bin\Debug\WpfApp3.exe" にコピーできませんでした。10 回の再試行回数を超えたため、失敗しました。このファイルは "WpfApp3 (44296)" によってロックされています。 WpfApp3
TN8001

2020/03/19 06:12

WpfApp3が終了していませんね。 タスクマネージャーでWpfApp3を探してタスクの終了を選んでください。
guest

0

var window = new Window1();
は、関数の外に出して、クリックイベント中ではShowとHideだけするようにしましょう

投稿2020/03/16 13:34

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問