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

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

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

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

3177閲覧

WPFでキッチンタイマーを作りたいが、表示画面が変化しない

taq_cs

総合スコア12

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2019/02/04 12:29

前提・実現したいこと

WPFでキッチンタイマーを作りたい

ここに質問の内容を詳しく書いてください。
(例)
プログラム初心者(歴2か月)です。
WPFでキッチンタイマーを作る課題を行っています。
一通り実装しデバック実行したところ、数字が動いていることは確認できたのですが、表示される数字が変化しません。
LabelのContextを動的に変化させるにはどうしたらよいでしょうか?

アプリの概要としては
①「10分」のボタンを押下する(のちに他の数字も増やす予定です。)
②画面表示を押下→押下した時間が別ウィンドウ(MainWindow)で表示される
(ここまで成功)
③別ウィンドウ

該当のソースコード

C#

1 2//Control.xaml 3 4<Window x:Class="Clock.Control" 5 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 6 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 7 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 8 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 9 xmlns:local="clr-namespace:Clock" 10 mc:Ignorable="d" 11 Title="Control" Height="450" Width="800" Background="Black" 12 Loaded="Window_Loaded"> 13 <Grid Cursor="Arrow"> 14 <Grid.ColumnDefinitions> 15 <ColumnDefinition/> 16 </Grid.ColumnDefinitions> 17 <Label x:Name="Timer" Content="00:00" HorizontalAlignment="Center" Height="138" Margin="255,49,273.6,233" VerticalAlignment="Center" Width="265" Background="Black" Foreground="White" FontSize="100" RenderTransformOrigin="0.491,0.383" /> 18 <Button x:Name="Start" Content="スタート" HorizontalAlignment="Left" Margin="108,301,0,0" VerticalAlignment="Top" Width="128" Height="59" FontSize="30" Click="Start_Click" /> 19 <Button x:Name="ten" Content="10分" HorizontalAlignment="Left" Height="46" Margin="341,316,0,0" VerticalAlignment="Top" Width="82" Click="Ten_Click"/> 20 <Button x:Name="show" Content="画面表示" HorizontalAlignment="Left" Margin="624,91,0,0" VerticalAlignment="Top" Width="138" Height="51" FontSize="30" Click="Show_Click"/> 21 22 </Grid> 23</Window> 24

C#

1 2//Control.xaml.cs 3 4using System; 5using System.Windows; 6 7namespace Clock 8{ 9 /// <summary> 10 /// Control.xaml の相互作用ロジック 11 /// </summary> 12 public partial class Control : Window 13 { 14 public Control() 15 { 16 InitializeComponent(); 17 } 18 19 public string Time { get; set; } 20 21 public int TimeLimit { get; set; } 22 23 private void Window_Loaded(object sender, RoutedEventArgs e) 24 { 25 Ten_Click(sender, e); 26 } 27 28 private void Show_Click(object sender, RoutedEventArgs e) 29 { 30 MainWindow main = new MainWindow(TimeLimit); 31 main.Show(); 32 } 33 34 private void Ten_Click(object sender, RoutedEventArgs e) 35 { 36 Time = new DateTime().ToString("10:00"); 37 Timer.Content = Time; 38 TimeLimit = 600; 39 } 40 41 private void Start_Click(object sender, RoutedEventArgs e) 42 { 43 MainWindow main = new MainWindow(TimeLimit); 44 main.StartTimer(); 45 } 46 } 47} 48

C#

1 2//MainWindow.cs 3 4<Window x:Class="Clock.MainWindow" 5 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 6 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 7 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 8 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 9 xmlns:local="clr-namespace:Clock" 10 mc:Ignorable="d" 11 Title="MainWindow" Height="450" Width="800" 12 Loaded="Window_Loaded"> 13 <Grid OpacityMask="#FFFDFDFD" Background="Black"> 14 <Label x:Name="ShowTimer" Content="Label" Margin="95,25,92.6,71" FontSize="250" Foreground="White" /> 15 16 </Grid> 17</Window> 18 19

C#

1 2//MainWindow.xaml.cs 3 4using System; 5using System.Windows; 6using System.Windows.Threading; 7 8namespace Clock 9{ 10 /// <summary> 11 /// MainWindow.xaml の相互作用ロジック 12 /// </summary> 13 public partial class MainWindow : Window 14 { 15 private int TimeLimit { get; set; } 16 17 private string _timeLimit { get; set; } 18 private TimeSpan oldTimeSpan; 19 private Object _lockobj = new object(); 20 private System.Windows.Threading.DispatcherTimer disPartcherTimer; 21 22 public MainWindow(int _time) 23 { 24 InitializeComponent(); 25 TimeLimit = _time; 26 var span = new TimeSpan(0, 0, _time); 27 _timeLimit = span.ToString(@"mm\:ss"); 28 29 disPartcherTimer = new DispatcherTimer(DispatcherPriority.Normal); 30 disPartcherTimer.Interval = new TimeSpan(0, 0, 0, 1); 31 disPartcherTimer.Tick += new EventHandler(Dispatcher_Tick); 32 } 33 34 private void Window_Loaded(object sender, RoutedEventArgs e) 35 { 36 ShowClock(TimeLimit); 37 } 38 39 void Dispatcher_Tick(object sender, EventArgs e) 40 { 41 42 TimeLimit--; 43 ShowClock(TimeLimit); 44 if (TimeLimit == 0) 45 { 46 TimerStop(); 47 TimeReset(); 48 } 49 50 } 51 52 public void ShowClock(int _time) 53 { 54 var time = new TimeSpan(0, 0, _time); 55 ShowTimer.Content = time.ToString(@"mm\:ss"); 56 } 57 58 public void StartTimer() 59 { 60 disPartcherTimer.Start(); 61 } 62 63 public void TimerStop() 64 { 65 oldTimeSpan = oldTimeSpan.Add(nowTimeSpan); 66 disPartcherTimer.Stop(); 67 } 68 69 public void TimeReset() 70 { 71 oldTimeSpan = new TimeSpan(); 72 //TextBlock tb = this.FindName("ShowTimer") as TextBlock; 73 //tb.Text = "00:00"; 74 75 ShowTimer.Content = "00:00"; 76 } 77 } 78} 79 80

補足情報

Visual Studio2017を使っています。
ここにより詳細な情報を記載してください。

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

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

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

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

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

takabosoft

2019/02/05 01:17

MainWindowのShowClock関数でラベルを動的に更新しているように見えますが、ここが動かないのですか?
guest

回答1

0

ベストアンサー

以下が問題点です。

C#

1 private void Show_Click(object sender, RoutedEventArgs e) 2 { 3 // 画面を作成し、表示している 4 MainWindow main = new MainWindow(TimeLimit); 5 main.Show(); 6 } 7 8 private void Start_Click(object sender, RoutedEventArgs e) 9 { 10 // 画面を新たに作成し、そのタイマーをスタートしている(表示されない) 11 MainWindow main = new MainWindow(TimeLimit); 12 main.StartTimer(); 13 }

タイマー画面は必ず一つという制約があるならば、Control画面クラスのメンバにMainWindow画面のインスタンスを持ってしまうといいと思います。
タイマー画面が複数あることがあるならば、オレオレ仕様でない限り、Control画面から弄るのは無理かと思います。その場合はMainWindow側にスタートボタンを用意しちゃった方がいいと思います。

投稿2019/02/05 08:37

moredeep

総合スコア1507

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

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

taq_cs

2019/02/05 11:42

MainWindow側で再度書き直したところ、無事動きました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問