60

これらの 3 種類の WPF アプリケーションがあります...

  • WindowMain
  • UserControlZack
  • ウィンドウモーダル

UserControlZack1 は私の WindowMain に座っています...

<Window x:Class="WindowMain"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ProjectName"
        ...
        Name="WindowMain">
    <Grid>
        ...
        <local:UserControlZack x:Name="UserControlZack1" ... />
        ...
    </Grid>
</Window>

UserControlZack1 は WindowModal ダイアログ ボックスを表示します...

部分パブリック クラス UserControlZack

   ...

    プライベート サブ SomeButton_Click(...)
        'ダイアログ ボックスをインスタンス化し、モーダルで開く...
        薄暗いボックス As WindowModal = New WindowModal()
        box.Owner = ?????
        box.ShowDialog()
        'ダイアログボックスが受け入れられた場合、ユーザーが入力したデータを処理します...
        If (box.DialogResult.GetValueOrDefault = True) その後
            _SomeVar = box.SomeVar
            ...
        終了条件
    サブ終了

クラス終了

box.Owner を WindowMain の実行中のインスタンスである正しい Window に設定するにはどうすればよいですか?

box.Owner = Me.Owner「'Owner' は 'ProjectName.UserControlZack' のメンバーではないため、使用できません。」

box.Owner = Me.Parentウィンドウではなくグリッドを返すため、使用できません。

box.Owner = WindowMain「'WindowMain' は型であり、式として使用できない」ため、使用できません。

4

6 に答える 6

135

使ってみて

.Owner = Window.GetWindow(this)
于 2009-03-04T08:11:14.940 に答える
47

コントロールが入っているトップ レベル ウィンドウを取得するには、次のようにします。

(Window)PresentationSource.FromVisual(this).RootVisual

メイン ウィンドウを表示するには:

Application.Current.MainWindow
于 2009-03-04T08:08:09.113 に答える
10
MyWpfDialog dialog = new MyWpfDialog();

//remember, this is WinForms UserControl and its Handle property is
//actually IntPtr containing Win32 HWND.

new System.Windows.Interop.WindowInteropHelper(dialog).Owner = this.Handle;

dialog.ShowDialog();
于 2011-10-03T14:28:44.183 に答える
5

コメントからグレッグを助けようとする更新。このコマンドは、メイン ウィンドウ メニュー、ユーザー コントロールのボタン、およびユーザー コントロールのコンテキスト メニューで機能します。

コマンドでやります。したがって、クラス Commands.cs は次のようになります。

public static class Commands
{
    public static RoutedUICommand TestShowDialogCommand = new RoutedUICommand("Test command", "TestShowDialog", typeof(Commands));
}

これらをメイン ウィンドウに登録します: (canshow は必要ありません。デフォルトは true です)。

    public Window1()
    {
        InitializeComponent();

        CommandManager.RegisterClassCommandBinding(typeof(System.Windows.Controls.Control),
            new CommandBinding(Commands.TestShowDialogCommand, ShowDialogCommand, CanShowDialogCommand));
    }

    private void ShowDialogCommand(object sender, ExecutedRoutedEventArgs e)
    {
        var box = new Window();
        box.Owner = this;
        box.ShowDialog();

    }

    private void CanShowDialogCommand(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }

これは、メイン ウィンドウの xaml です。

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="322">
<Grid>
    <StackPanel>
        <Menu>
            <MenuItem Header="Test">
                <MenuItem Header="ShowDialog" Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}"/>
            </MenuItem>
        </Menu>
        <WpfApplication1:BazUserControl />
    </StackPanel>
</Grid>
</Window>

これは私のユーザー コントロールの xaml です (既定のコード ビハインドのみ)

<UserControl x:Class="WpfApplication1.BazUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Height="300" Width="300">
<Grid>
    <StackPanel>
        <Button Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}" Content="ClickMe" ></Button>
        <TextBox>
            <TextBox.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="ShowDialog" Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}" />
                </ContextMenu>
            </TextBox.ContextMenu>
        </TextBox>
    </StackPanel>
</Grid>
</UserControl>

もう少し進んで、代わりにコントローラー クラスでコマンドを処理し、もう少し MVC にすることができます。

于 2009-03-03T17:51:58.640 に答える
0

XAML をクロールすることで動作するようになりました...

box.Owner = DirectCast(DirectCast(DirectCast(Me.Parent, Grid).Parent, Grid).Parent, Window)

しかし、これは非常にエレガントではないようです。より良い方法はありますか?

于 2009-03-03T17:44:04.510 に答える
0

ウィンドウの名前を WindowMain1 などに変更し、所有者をそれに設定するのはどうですか?

于 2009-03-03T17:47:34.063 に答える