私は現在、ポップアップに対するアクションがフォーカスをアプリケーションのメイン ウィンドウに戻そうとする WPF ポップアップで問題を抱えています。
通常、ウィンドウのどこかをクリックすると、ポップアップが閉じます。これは望ましい動作です。ただし、ポップアップ内のアクションから同じようにフォーカスをウィンドウに戻すプログラム的な方法は見つかりませんでした。
次のコードは、問題の概要を示しています。
Xaml:
<Window x:Class="PopupFocusEtc.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" x:Name="_wdw">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition /><ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox x:Name="_txt" Text="Test"
Grid.ColumnSpan="2" />
<Button Grid.Row="1" x:Name="_btnOpen"
Click="OpenPopup"
Content="Open Popup" Grid.ColumnSpan="2" />
<Popup x:Name="_popup"
Placement="Bottom"
HorizontalOffset="10"
PlacementTarget="{Binding ElementName=_btnOpen}"
StaysOpen="False">
<Button Click="SwitchFocus"
MinHeight="100" MinWidth="100"
Margin="5"
Content="Focus" />
</Popup>
<Rectangle Grid.Column="1" Grid.Row="2"
Fill="DarkOliveGreen">
<Rectangle.Style>
<Style TargetType="Rectangle">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Cursor" Value="Hand" />
</Trigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>
</Grid>
</Window>
コード ビハインド:
using System.Windows;
using System.Windows.Input;
namespace PopupFocusEtc
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OpenPopup(object sender, RoutedEventArgs e)
{
_popup.IsOpen = true;
}
private void SwitchFocus(object sender, RoutedEventArgs e)
{
_txt.Focus();
Keyboard.Focus(_txt);
_txt.SelectAll();
_wdw.Activate();
}
}
}
ポップアップのボタンをクリックすると、テキストボックスが正しくフォーカスされ、テキストを入力することもできますが、ポップアップは開いたままになります。また、カーソルを手に切り替える四角形の MouseOver 効果にも注意してください。ウィンドウにフォーカスがあっても、効果が機能していません。
ウィンドウをクリックしたときにのみ、ポップアップが消え、効果が再び機能します。
私の質問は次のとおりです。この状況を考えると、メインウィンドウをクリックしたかのように、メインウィンドウを再びアクティブにするにはどうすればよいですか?
アップデート
与えられた例では、分離コードでポップアップを単純に閉じることができることを知っています。これは単純化された例です。別のアプリでは、Popup UI 内から開始されたアクションは、それが Popup に存在することを認識せず、メイン ウィンドウで何が起こっても popup について認識しません。
したがって、UI にさらに結合を導入する前に、ウィンドウをクリックしたときに実行されるメカニズムを何らかの方法でプログラムでトリガーできるかどうかを知りたいと思います...