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
'programing' 카테고리의 다른 글
Eclipse 프로젝트에서 일부 폴더를 제외하려면 어떻게 해야 합니까? (0) | 2023.05.09 |
---|---|
Git, 이전 커밋 사용자 이름 및 이메일 다시 쓰기 (0) | 2023.05.09 |
범위 선택 시 VBA 런타임 오류 1004 "응용 프로그램 정의 오류 또는 개체 정의 오류" (0) | 2023.05.09 |
Python 3.5.1용 urllib2를 설치해야 함 (0) | 2023.05.09 |
Azure 앱 서비스와 클라우드 서비스의 차이점 (0) | 2023.05.09 |