銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Visual Studio 2017 SDKでXAMLのモーダルダイアログを出す

Visual Studio 2017 SDKでメニューなどからモーダルダイアログを出す場合に、その画面をXAMLで作ることにします。

といってもDialogWindowクラスを使うと簡単にできます。

docs.microsoft.com

とりあえず、プロジェクトにWPFのユーザーコントロールアイテムあたりを適当に追加します。(あとからクラスを変更するので、なんでもよい)

で、XAML側を次のように変更します。Microsoft.VisualStudio.Shell.15.0というアセンブリにあるMicrosoft.VisualStudio.PlatformUI.DialogWindowを使うのがポイントです。Gridの中身はサンプルで入れてますが、なんでもよいです。

<platformUi:DialogWindow x:Class="MyVisualStudio.Vsix.Views.MyDialogWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:platformUi="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.15.0"
             mc:Ignorable="d" 
             WindowStartupLocation="CenterScreen"
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="191,88,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Text="{Binding Title.Value}"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="191,128,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Text="{Binding Message.Value}"/>
        <Button Content="Button" HorizontalAlignment="Left" Margin="213,196,0,0" VerticalAlignment="Top" Width="75" Command="{Binding DeployCommand}"/>
    </Grid>
</platformUi:DialogWindow>

コードビハインドも書き換えます。helpTopicという引数を取るコンストラクタをオーバーライドして、これを呼び出すとヘルプボタンが表示されて、指定した文字列でF1ヘルプが有効になるのですが、F1ヘルプにコンテンツを追加する方法がまだわからないので、とりあえずこういうのがあるという紹介だけ。

using Microsoft.VisualStudio.PlatformUI;

namespace MyVisualStudio.Vsix.Views
{

    public partial class MyDialogWindow: DialogWindow
    {
        public MyDialogWindow()
        {
            InitializeComponent();
        }

        public MyDialogWindow(string helpTopic) : base(helpTopic)
        {
            InitializeComponent();
        }
    }
}

あとはダイアログを表示する場所でViewをインスタンス化して、ShowModalメソッドを呼べばOKです。

private void MenuItemCallback(object sender, EventArgs e)
{
    var dialog = new DeployToOpenShiftWindow();
    dialog.ShowModal();
}

以上です。