programing

WPF: 사용자 컨트롤에 표시되는 대화 상자의 소유자 창을 설정하려면 어떻게 해야 합니까?

lovejava 2023. 5. 9. 21:58

WPF: 사용자 컨트롤에 표시되는 대화 상자의 소유자 창을 설정하려면 어떻게 해야 합니까?

WPF 애플리케이션에 이 세 가지 종류의 것들이 세 가지 유형이 있습니다.

  • 창 기본
  • 사용자 컨트롤 잭
  • 윈도우 모달

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 대화 상자가 표시됩니다...

부분 공용 클래스 사용자 컨트롤잭
...
개인 하위 일부 단추_클릭(...)'대화 상자를 재생하고 모드로 엽니다.'
Dim box As WindowModal = 새 WindowModal()상자에 담다소유자 = ????상자에 담다대화 상자 표시()'대화 상자를 수락한 경우 사용자가 입력한 데이터 처리...
만약(상자).대화 상자 결과.GetValueOrDefault = True) 그러면_SomeVar = 상자.썸바...
종료할 경우끝 하위 항목
클래스 종료

박스 세팅은 어떻게 하나요?올바른 Window의 소유자, 실행 중인 WindowMain 인스턴스?

사용할 수 없습니다.box.Owner = Me.Owner"Owner"가 'ProjectName'의 멤버가 아니기 때문입니다.'사용자 제어 잭'."

사용할 수 없습니다.box.Owner = Me.Parent창이 아니라 그리드를 반환하기 때문입니다.

사용할 수 없습니다.box.Owner = WindowMain""WindowMain"은 형식이므로 표현식으로 사용할 수 없습니다."

사용해 보십시오.

.Owner = Window.GetWindow(this)

컨트롤이 있는 최상위 창을 가져오려면 다음 중 하나가 있다고 가정합니다.

(Window)PresentationSource.FromVisual(this).RootVisual

기본 창을 가져오는 방법

Application.Current.MainWindow
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();

댓글에서 그렉을 도와주기 위해 업데이트 중입니다.명령은 기본 창 메뉴, 사용자 컨트롤의 버튼 및 사용자 컨트롤의 상황에 맞는 메뉴에서 작동합니다.

명령어로 하겠습니다.Commands.cs 클래스는 다음과 같습니다.

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

기본 창에 등록합니다. (기본값을 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를 더 많이 사용할 수 있습니다.

XAML을 통해 다시 기어올라가서 작동하게 했습니다.

box.Owner = DirectCast(DirectCast(Me)).상위, 그리드).상위, 그리드).상위, 창)

하지만 이것은 꽤 품위가 없어 보입니다.더 좋은 방법이 있습니까?

윈도우의 이름을 윈도우 메인 1 같은 것으로 변경하고, 소유자를 윈도우 메인 1로 설정하는 것은?

언급URL : https://stackoverflow.com/questions/607370/wpf-how-do-i-set-the-owner-window-of-a-dialog-shown-by-a-usercontrol