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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

XAML

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

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

スライダー

GUIのグラフィカルウィジェットのひとつです。インジケーターを動かすことで値を調節可能とします。

Q&A

解決済

1回答

2559閲覧

【UWP】コードからスライダーの値を変更時にValueChangedイベントを発生させない方法

J.M.

総合スコア12

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

XAML

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

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

スライダー

GUIのグラフィカルウィジェットのひとつです。インジケーターを動かすことで値を調節可能とします。

0グッド

0クリップ

投稿2021/04/08 06:33

UWPでWindows向けアプリケーションを作っています。
UIのスライダーの値をコードから変更した際にValueChangedイベントを発生させない方法を知りたいです。

または、ValueChangedイベント内で、イベント発生原因が「ユーザーによるUI操作かコードからの変更か」を知る方法はありますか。
AndroidのスライダーUIの「OnSeekBarChangeListener」では、「fromUser: Boolean」によって変更元がユーザーかコードか判別できます。
同様のものがUWPのスライダーにありましたらご教授いただければ幸いです。

背景
サーバーと通信しスライダーの値を同期させているのですが、値を変更するとループに陥ります。
サーバー側の変更は出来ないため、イベントの発火原因がユーザーかコードかによって切り分けたいと考えています。

よろしくお願いいたします。

xaml

1<Slider x:Name="sldr_volume" Width="300" Margin="0,20,0,0" Minimum="0" Maximum="100" IsEnabled="True" 2 ValueChanged="sldr_volume_ValueChanged" LargeChange="1" /> 3

C#

1public void ChangeUIVolume(int vol) 2{ 3 //サーバーからの値変更の通知受信後、スライダーの値を変更 4 sldr_volume.Value = vol; 5} 6private void sldr_volume_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) 7{ 8 //ChangeUIVolume()から値が変更された場合は呼び出されない or 9 //呼び出し元がユーザーによるUI操作かコードからの変更か知りたい 10 Debug.WriteLine(e.NewValue); 11 サーバーに送信(e.NewValue)//サーバーからは値の変更の通知が飛んでくる 12}

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

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

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

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

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

guest

回答1

0

ベストアンサー

formUser的な表現はUWPのSliderにはおそらく無いのでアプリケーションコード側で状態管理して変更を無視等してやる必要があります。

diff

1+ private bool _nowSliderValueChangingFromServer; 2 3public void ChangeUIVolume(int vol) 4{ 5+ _nowSliderValueChangingFromServer = true; 6 //サーバーからの値変更の通知受信後、スライダーの値を変更 7 sldr_volume.Value = vol; 8+ _nowSliderValueChangingFromServer = false; 9} 10 11private void sldr_volume_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) 12{ 13+ if (_nowSliderValueChangingFromServer) { return; } 14 15 //ChangeUIVolume()から値が変更された場合は呼び出されない or 16 //呼び出し元がユーザーによるUI操作かコードからの変更か知りたい 17 Debug.WriteLine(e.NewValue); 18 サーバーに送信(e.NewValue)//サーバーからは値の変更の通知が飛んでくる 19} 20

参考

UWP slider After sliding
https://stackoverflow.com/questions/57441288/uwp-slider-after-sliding

投稿2021/04/08 11:01

tor4kichi

総合スコア769

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

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

J.M.

2021/04/09 02:09

確かに自分で管理できますね、視野が狭まってました。ありがとうございます!!(本題ではないですが、コード追記部分のハイライト化とても見やすいです)
tor4kichi

2021/04/09 02:57

他の回答者さん向けの情報ですが ```diff + 緑にハイライト表示したい行の先頭に+ - 赤ハイライトは - をつける ``` とやればハイライト表示できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問