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

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

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

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

XAML

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

WPF

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

Q&A

解決済

1回答

3200閲覧

WPFでボタンのダブルクリック抑制とキーボードフォーカス

mochi_ponyo

総合スコア14

C#

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

XAML

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

WPF

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

1グッド

0クリップ

投稿2021/07/27 07:26

編集2021/07/27 07:38

AsyncReactiveCommandでWPFのお手軽ダブルクリック抑制
の記事を参考に、ボタンのダブルクリック抑制を入れました。

このボタンをキーボードのカーソルキーでも操作したいのですが、
ダブルクリック抑制が走るとそれ以降、キーボードのフォーカスがどこかへ行ってしまい、
キーボードでの操作ができなくなって困っています。

「キーボードの上下でボタンを選び、エンターキーでボタンを押す。それを何度も繰り返す。」

これをダブルクリック抑制とうまく同居させることは可能でしょうか?

xaml

1<Window x:Class="WpfApp4.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp4" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="300" Width="400"> 9 <Window.DataContext> 10 <local:MainWindowViewModel/> 11 </Window.DataContext> 12 <Grid> 13 <Button x:Name="button1" Content="Button1" HorizontalAlignment="Left" Margin="10,0,0,239" VerticalAlignment="Bottom" Width="372" Command="{Binding ButtonClickAsyncCommand1}"/> 14 <Button x:Name="button2" Content="Button2" HorizontalAlignment="Left" Margin="10,35,0,0" VerticalAlignment="Top" Width="372" Command="{Binding ButtonClickAsyncCommand2}"/> 15 </Grid> 16</Window>

cs

1using System.Windows; 2using System.Windows.Input; 3 4namespace WpfApp4 5{ 6 /// <summary> 7 /// MainWindow.xaml の相互作用ロジック 8 /// </summary> 9 public partial class MainWindow : Window 10 { 11 public MainWindow() 12 { 13 InitializeComponent(); 14 15 // 初期フォーカス設定 16 Loaded += (s, e) => { Keyboard.Focus(button1); }; 17 } 18 } 19}

cs

1using System.Threading.Tasks; 2using Reactive.Bindings; 3 4namespace WpfApp4 5{ 6 class MainWindowViewModel 7 { 8 public AsyncReactiveCommand ButtonClickAsyncCommand1 { get; } = new AsyncReactiveCommand(); 9 public AsyncReactiveCommand ButtonClickAsyncCommand2 { get; } = new AsyncReactiveCommand(); 10 11 public MainWindowViewModel() 12 { 13 ButtonClickAsyncCommand1.Subscribe(async _ => 14 { 15 await Task.Delay(500); 16 }); 17 ButtonClickAsyncCommand2.Subscribe(async _ => 18 { 19 await Task.Delay(500); 20 }); 21 } 22 } 23}
TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

ダブルクリック抑制が走るとそれ以降、キーボードのフォーカスがどこかへ行ってしまい、
キーボードでの操作ができなくなって困っています。

ボタンが一時的に無効になるので、Windowにフォーカスが飛んでいると思います。
Tabキーを押せば戻ってくると思いますが、そういうことではないんですよね?

ボタンを押したらどこにフォーカスが行くのがいいんでしょうか?

  1. 無効の間どこかへ行ってもいいが、有効に戻った時に取り戻す(普通のボタンと同じ使い勝手)
    IsEnabledを見て、FocusedElementを自身に設定するような感じでどうでしょう?
    ほかにも有効無効が変わりがちなボタンがあると邪魔かも。
  2. 無効になったんだから次のボタンに行くべき
    1とは逆に相手側を見て自身をセットしましたが、わかりにくいし冗長になるしいいとこないですね^^;

やるんだったらビヘイビアでやるべきでしょうね。

FocusedElementはあくまで論理フォーカスなので、場合によってはキーボードフォーカスが来ないこともあります。
Keyboard.Focusを呼ぶほうが確実性は高いでしょうが、これもビヘイビアになるでしょうか。

FocusManager.FocusedElement 添付プロパティ (System.Windows.Input) | Microsoft Docs

Keyboard.Focus(IInputElement) メソッド (System.Windows.Input) | Microsoft Docs

フォーカスの概要 - WPF .NET Framework | Microsoft Docs

xml

1<Window 2 x:Class="Questions351448.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="clr-namespace:Questions351448" 6 Width="400" 7 Height="300" 8 FocusManager.FocusedElement="{Binding ElementName=button1}"> 9 <Window.DataContext> 10 <local:MainWindowViewModel /> 11 </Window.DataContext> 12 <Window.Resources> 13 <Style x:Key="SelfFocusStyle" TargetType="Button"> 14 <Style.Triggers> 15 <Trigger Property="IsEnabled" Value="True"> 16 <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" /> 17 </Trigger> 18 </Style.Triggers> 19 </Style> 20 </Window.Resources> 21 <Grid> 22 <Grid.RowDefinitions> 23 <RowDefinition /> 24 <RowDefinition /> 25 </Grid.RowDefinitions> 26 <GroupBox Header="1. 自身に再設定"> 27 <StackPanel> 28 <Button 29 x:Name="button1" 30 Command="{Binding Command1}" 31 Content="Button1" 32 Style="{StaticResource SelfFocusStyle}" /> 33 <Button 34 x:Name="button2" 35 Command="{Binding Command2}" 36 Content="Button2" 37 Style="{StaticResource SelfFocusStyle}" /> 38 </StackPanel> 39 </GroupBox> 40 41 <GroupBox Grid.Row="1" Header="2. 次のボタン"> 42 <StackPanel> 43 <Button 44 x:Name="button3" 45 Command="{Binding Command3}" 46 Content="Button3"> 47 <Button.Style> 48 <Style TargetType="Button"> 49 <Style.Triggers> 50 <DataTrigger Binding="{Binding IsEnabled, ElementName=button4}" Value="False"> 51 <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" /> 52 </DataTrigger> 53 </Style.Triggers> 54 </Style> 55 </Button.Style> 56 </Button> 57 <Button 58 x:Name="button4" 59 Command="{Binding Command4}" 60 Content="Button4"> 61 <Button.Style> 62 <Style TargetType="Button"> 63 <Style.Triggers> 64 <DataTrigger Binding="{Binding IsEnabled, ElementName=button3}" Value="False"> 65 <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" /> 66 </DataTrigger> 67 </Style.Triggers> 68 </Style> 69 </Button.Style> 70 </Button> 71 </StackPanel> 72 </GroupBox> 73 </Grid> 74</Window>

cs

1using Reactive.Bindings; 2using System.Threading.Tasks; 3using System.Windows; 4 5namespace Questions351448 6{ 7 public partial class MainWindow : Window 8 { 9 public MainWindow() => InitializeComponent(); 10 } 11 12 class MainWindowViewModel 13 { 14 public AsyncReactiveCommand Command1 { get; } = new AsyncReactiveCommand(); 15 public AsyncReactiveCommand Command2 { get; } = new AsyncReactiveCommand(); 16 public AsyncReactiveCommand Command3 { get; } = new AsyncReactiveCommand(); 17 public AsyncReactiveCommand Command4 { get; } = new AsyncReactiveCommand(); 18 19 public MainWindowViewModel() 20 { 21 Command1.Subscribe(async () => await Task.Delay(500)); 22 Command2.Subscribe(async () => await Task.Delay(500)); 23 Command3.Subscribe(async () => await Task.Delay(500)); 24 Command4.Subscribe(async () => await Task.Delay(500)); 25 } 26 } 27}

投稿2021/07/27 09:48

編集2023/07/28 14:29
TN8001

総合スコア9321

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

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

mochi_ponyo

2021/07/28 08:27

ありがとうございます。おかげさまで動作するようになりました。 やりたかったのはまさに 「1.無効の間どこかへ行ってもいいが、有効に戻った時に取り戻す(普通のボタンと同じ使い勝手)」 のほうでした。(TABキーは要件にないので使えませんでした) わかりやすいコードも添付していただき、Style.Triggersでの設定方法等よく理解できました。 とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問