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

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

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

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

Visual Studio

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

XAML

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

WPF

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

Q&A

解決済

1回答

2874閲覧

[WPF] DataGridCellをWクリックした時にトグルボタンにバインドしたポップアップを開いたままにしたい

toolscloudy

総合スコア20

C#

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

Visual Studio

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

XAML

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

WPF

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

0グッド

0クリップ

投稿2019/07/03 06:25

前提

DataGridのMouseDoubleClickイベントにセルをWクリックした時に、トグルボタンのIsCheckedプロパティをTrueにし、トグルボタンにバインドされているポップアップを表示する処理を仕込んでいます。

問題・実現したいこと

以下のGifはセルをWクリックした時の動作です。

(3回Wクリックしています)
イメージ説明
セルをWクリック時にポップアップが表示されすぐに消えてしまいます。
これを表示されたままにしたいのですが、上記の原因がわかりません。
何か解決方法はありますでしょうか?

コード

XAML

1<!--トグルボタン--> 2<ToggleButton Grid.Row="1" x:Name="ToggleButtonRegistedInfo" Margin="0" IsChecked="{Binding IsOpen, ElementName=PopupRegistedInfo}"> 3 <ToggleButton.Style> 4 <Style TargetType="ToggleButton" BasedOn="{StaticResource NormalToggleButtonStyle}"> 5 <Style.Triggers> 6 <DataTrigger Binding="{Binding IsOpen, ElementName=PopupRegistedInfo}" Value="True"> 7 <Setter Property="IsHitTestVisible" Value="False"/> 8 </DataTrigger> 9 </Style.Triggers> 10 </Style> 11 </ToggleButton.Style> 12 <Image Source="./Icons/assignment_white_192x192.png"/> 13</ToggleButton> 14 15<!--トグルボタンにバインドされているポップアップ--> 16<Popup x:Name="PopupRegistedInfo" PlacementTarget="{Binding ElementName=RegistedInfoToggleButton}" Style="{StaticResource MenuPopupStyle}"> 17 <Border Style="{StaticResource PopupPanelBorderStyle}"> 18 <ScrollViewer Margin="5" VerticalScrollBarVisibility="Hidden"> 19 <StackPanel x:Name="StackPanelRegistedInfo"> 20 <Label Content="R E G I S T E D I N F O" FontSize="20"/> 21 <Border Margin="0,5,0,5" Style="{StaticResource BottomSeparateBorderStyle}"/> 22 <Grid Margin="0"> 23 <Grid.ColumnDefinitions> 24 <ColumnDefinition/> 25 <ColumnDefinition/> 26 <ColumnDefinition/> 27 </Grid.ColumnDefinitions> 28 <Button Grid.Column="0" 29 x:Name="ButtonDeleted" 30 Content="削除" FontWeight="DemiBold" Margin="5,0,5,0" Width="Auto" Visibility="Collapsed" 31 Background="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}}}" 32 Click="ButtonDeleted_Click"/> 33 <Button Grid.Column="1" 34 x:Name="ButtonUpdated" 35 Content="更新" FontWeight="DemiBold" Margin="5,0,5,0" Width="Auto" Visibility="Collapsed" 36 Background="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}}}" 37 Click="ButtonUpdated_Click"/> 38 <Button Grid.Column="2" 39 x:Name="ButtonRegisted" 40 Content="登録" FontWeight="DemiBold" Margin="5,0,5,0" Width="Auto" Visibility="Collapsed" 41 Background="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}}}" 42 Click="ButtonRegisted_Click"/> 43 </Grid> 44 <Border Margin="0,5,0,5" Style="{StaticResource BottomSeparateBorderStyle}"/> 45 </StackPanel> 46 </ScrollViewer> 47 </Border> 48</Popup>

C#

1// データグリッドのマウスWクリックイベント 2private void View_MouseDoubleClick(object sender, MouseButtonEventArgs e) 3{ 4 if (!(sender is DataGrid dataGrid)) 5 return; 6 7 if (dataGrid.SelectedCells.Count == 0 || dataGrid.SelectedCells[0].Column.DisplayIndex != 0) 8 return; 9 10 // Popupにあるテキストボックスなどに値を入れる処理 11 SelectedItems = (string[])dataGrid.SelectedCells[0].Item; 12 for (int i = 0; i < SelectedItems.Length; i++) 13 { 14 var element = StackPanelRegistedInfo.Children[ControlIndexes[i]]; 15 if (element is TextBox textBox) 16 { 17 textBox.Text = SelectedItems[i]; 18 } 19 else if (element is ComboBox comboBox) 20 { 21 comboBox.Text = SelectedItems[i]; 22 } 23 } 24 ButtonUpdated.Visibility = Visibility.Visible; 25 ButtonDeleted.Visibility = Visibility.Visible; 26 27 // ToggleButtonとバインドしているPopupを表示 28 ToggleButtonRegistedInfo.IsChecked = true; 29}

試したこと

MouseUpイベントでは上記の問題が発生しませんでした。
イメージ説明

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。

原因

まず今回の質問の反省点としてリソースで定義されたスタイルも乗せるべきでした。
以下はポップアップに適用されているスタイルです。

XAML

1<!--メニュ―用ポップアップのスタイル--> 2<Style TargetType="Popup" x:Key="MenuPopupStyle"> 3 <Setter Property="AllowsTransparency" Value="True"/> 4 <Setter Property="StaysOpen" Value="False"/> 5 <Setter Property="Placement" Value="Left"/> 6 <Setter Property="PopupAnimation" Value="Fade"/> 7</Style>

今回の問題としては、StaysOpenプロパティが原因でした。
このプロパティは値がFalseの時にフォーカスが外れると自動的にポップアップを消すもので、Wクリックイベントではこれが働くようです。

解決策

解決策としては、StaysOpenプロパティをトグルボタンのIsChekcedプロパティにバインドし、ボタンの押下以外ではポップアップを消えないようにしました。

以下、コードです。

XAML

1<ToggleButton Grid.Row="1" x:Name="ToggleButtonRegistedInfo" Margin="0" IsChecked="{Binding IsOpen, ElementName=PopupRegistedInfo}" Style="{StaticResource NormalToggleButtonStyle}"> 2 <Image Source="./Icons/assignment_white_192x192.png"/> 3</ToggleButton> 4<Popup x:Name="PopupRegistedInfo" PlacementTarget="{Binding ElementName=ToggleButtonRegistedInfo}" StaysOpen="{Binding IsChecked, ElementName=ToggleButtonRegistedInfo}" Style="{StaticResource MenuPopupStyle}"> 5 <Border Style="{StaticResource PopupPanelBorderStyle}"> 6 <ScrollViewer Margin="5" VerticalScrollBarVisibility="Hidden"> 7 <StackPanel x:Name="StackPanelRegistedInfo"> 8 <Label Content="R E G I S T E D I N F O" FontSize="20"/> 9 <Border Margin="0,5,0,5" Style="{StaticResource BottomSeparateBorderStyle}"/> 10 <Grid Margin="0"> 11 <Grid.ColumnDefinitions> 12 <ColumnDefinition/> 13 <ColumnDefinition/> 14 <ColumnDefinition/> 15 </Grid.ColumnDefinitions> 16 <Button Grid.Column="0" 17 x:Name="ButtonDeleted" 18 Content="削除" FontWeight="DemiBold" Margin="5,0,5,0" Width="Auto" Visibility="Collapsed" 19 Background="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}}}" 20 Click="ButtonDeleted_Click"/> 21 <Button Grid.Column="1" 22 x:Name="ButtonUpdated" 23 Content="更新" FontWeight="DemiBold" Margin="5,0,5,0" Width="Auto" Visibility="Collapsed" 24 Background="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}}}" 25 Click="ButtonUpdated_Click"/> 26 <Button Grid.Column="2" 27 x:Name="ButtonRegisted" 28 Content="登録" FontWeight="DemiBold" Margin="5,0,5,0" Width="Auto" Visibility="Collapsed" 29 Background="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}}}" 30 Click="ButtonRegisted_Click"/> 31 </Grid> 32 <Border Margin="0,5,0,5" Style="{StaticResource BottomSeparateBorderStyle}"/> 33 </StackPanel> 34 </ScrollViewer> 35 </Border> 36</Popup>

トグルボタンのIsHitTestVisible辺りを丸々消し、Popupに以下を追加しています。

XAML

1StaysOpen="{Binding IsChecked, ElementName=ToggleButtonRegistedInfo}"

最後に

ただこの解決方法だと、「フォーカスが外れた時に自動的にポップアップを消す」という動作ができなくなるため、他の機能部分で自動的にポップアップを消す動作をしていると、この解決方法を導入している部分のみ変則的な動きになり、違和感の原因になってしまいます。

開発中のアプリは自分用のためこれで解決としますが、エンドユーザーを考えるならもう少し考える必要がありそうです。

(私のWPFに対する知見が浅いのでもっとスタイリッシュな解決方法があるような気もしますが...)

投稿2019/07/03 09:38

編集2019/07/03 09:41
toolscloudy

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問