情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

WPFでCtrl+(Shift+)Tabでウィンドウ切り替え

できないかとやってみたらできました。

↓↓↓プロジェクト一式↓↓↓

まずは、XAML。

リソースでウィンドウのデータテンプレートとリストボックス項目のスタイルを指定しています。

切り替えコントロールはポップアップで作っています。配置は絶対配置で、位置はメインウィンドウのPopupRectプロパティから取得します。

<Window x:Class="WindowSwitchingSample.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="メインウィンドウ" Height="300" Width="300" KeyDown="Window_KeyDown" KeyUp="Window_KeyUp">
    <Window.Resources>
        <DataTemplate DataType="{x:Type Window}" x:Key="WindowTemplate">
            <StackPanel>
                <Rectangle Height="50" Width="50">
                    <Rectangle.Fill>
                        <VisualBrush Visual="{Binding}"></VisualBrush>
                    </Rectangle.Fill>
                </Rectangle>
            </StackPanel>
        </DataTemplate>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="true">
                    <Setter Property="RenderTransform">
                        <Setter.Value>
                            <ScaleTransform ScaleX="1.5" ScaleY="1.5" CenterX="25" CenterY="25"></ScaleTransform>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <DockPanel>
        <StackPanel DockPanel.Dock="Bottom" Orientation="Vertical">
            <TextBlock>ウィンドウのテキスト:</TextBlock>
            <TextBox Name="textBox" Margin="5,0,5,5"></TextBox>
            <Button Name="button" Height="25" Margin="5" Click="button_Click">新しいウィンドウを作成</Button>
        </StackPanel>
        <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="32">メインウィンドウ</TextBlock>
        <Popup Name="popup" Placement="Absolute" PlacementRectangle="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=PopupRect}">
            <Border Width="420" Height="220" Background="White" BorderThickness="3" BorderBrush="Black">
                <StackPanel Width="400" Height="200" VerticalAlignment="Center" HorizontalAlignment="Center">
                    <ListBox Name="listBox" Width="400" Height="200" ItemTemplate="{StaticResource WindowTemplate}">
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <WrapPanel></WrapPanel>
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>
                    </ListBox>
                </StackPanel>
            </Border>
        </Popup>
    </DockPanel>
</Window>

コードビハインド。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;

namespace WindowSwitchingSample
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;

            ReBind();
        }

        private static Random random = new Random();

        public Rect PopupRect
        {
            get
            {
                return new Rect((System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width - 420) / 2, (System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height - 220) / 2, 420, 220);
            }
        }

        private void ReBind()
        {
            listBox.ItemsSource = Application.Current.Windows;
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            Window window = new Window();
            window.Width = 256;
            window.Height = 256;
            window.WindowStyle = WindowStyle.ToolWindow;
            window.Background = new SolidColorBrush(Color.FromRgb((byte)random.Next(256), (byte)random.Next(256), (byte)random.Next(256)));
            window.Title = textBox.Text;
            window.KeyDown += new KeyEventHandler(Window_KeyDown);
            window.KeyUp += new KeyEventHandler(Window_KeyUp);
            window.Closed += new EventHandler(window_Closed);

            StackPanel stackPanel = new StackPanel();
            stackPanel.VerticalAlignment = VerticalAlignment.Center;
            stackPanel.HorizontalAlignment = HorizontalAlignment.Center;

            TextBlock textBlock = new TextBlock();
            textBlock.Text = textBox.Text;
            textBlock.Foreground = new SolidColorBrush(Color.FromRgb((byte)random.Next(256), (byte)random.Next(256), (byte)random.Next(256)));

            stackPanel.Children.Add(textBlock);
            window.Content = stackPanel;

            ReBind();

            window.Show();
        }

        void window_Closed(object sender, EventArgs e)
        {
            ReBind();
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab)
                if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
                {
                    e.Handled = true;

                    if (!popup.IsOpen)
                    {
                        popup.IsOpen = true;
                        listBox.SelectedItem = sender;
                    }
                    else
                    {
                        if (!(Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)))
                            if (listBox.SelectedIndex + 1 == listBox.Items.Count)
                                listBox.SelectedIndex = 0;
                            else
                                listBox.SelectedIndex++;
                        else
                            if (listBox.SelectedIndex == 0)
                                listBox.SelectedIndex = listBox.Items.Count - 1;
                            else
                                listBox.SelectedIndex--;
                    }
                }
        }

        private void Window_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
            {
                popup.IsOpen = false;
                Window window = listBox.SelectedItem as Window;
                if (window != null)
                    window.Activate();
            }
        }
    }
}

(終)

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-C#, wpf