sourcetip

WPF WindowStartupLocation="CenterOwner"는 실제로 중앙에 있지 않고 전체적으로 팝업됩니다. 이유는 무엇입니까?

fileupload 2023. 4. 28. 21:15
반응형

WPF WindowStartupLocation="CenterOwner"는 실제로 중앙에 있지 않고 전체적으로 팝업됩니다. 이유는 무엇입니까?

, 질문과 이 질문은 비슷하지만 효과적인 답은 없습니다.사실 저는 Windows StartupLocation=CenterOwner가 작동하기를 바랬지만 작동하지 않습니다.새 창을 주 창 중앙이 아닌 그리드 열 중앙에 배치하는 것 같습니다.그래서 저는 그것이 부모라고 생각한다고 생각합니다.두 번째 대화 상자를 닫았다가 다시 열 때 대화 상자는 중심이 아니라 이전 위치에서 오른쪽 아래로 이동합니다.메인 창을 두 번째 모니터로 이동해도 팝업이 기본 모니터에서 계속 열립니다.이 속성들이 잘못된 것입니까, 아니면 단지 다른 방식으로 작동해야 한다고 생각하는 것입니까?상단 및 왼쪽 속성을 수동으로 계산할 수 있을 것 같습니다.저는 팝업이 어디에 있든 메인 창에 집중되기를 원합니다.

소유자를 설정하지 않았기 때문일 수 있습니다.

this.Owner = App.MainWindow; // for example

제가 그렇게 하는 것이고 항상 창문의 중심을 완벽하게 잡아줍니다.

Will Eddins가 언급한 내용을 확장하려면 창에서 ShowDialog() 또는 Show()에 대한 오버로드 방법을 만들 수 있습니다.

public void ShowDialog(Window owner)
{
    this.Owner = owner;
    this.ShowDialog();
}

public void Show(Window owner)
{
    this.Owner = owner;
    this.Show();
}

또는 생성자를 오버로드합니다.

public MyWindow(Window owner)
    : this()
{
    this.Owner = owner;
}

이에 대한 확장을 생성하면 다음과 같은 훌륭한 아이디어를 재사용할 수 있습니다.

/// <summary>
/// Opens a window modally, with an owner
/// </summary>
/// <param name="window">The window to open</param>
/// <param name="opener">The owner of the window getting opened</param>
/// <returns>window.ShowDialog()</returns>
public static bool? ShowDialog(this Window window, Window opener)
{
    window.Owner = opener;
    return window.ShowDialog();
}

또한 다음을 사용할 수 있습니다.

this.Owner = App.Current.MainWindow;

또는Application대신에App.
하위 창 생성자에 배치합니다.

    public partial class ChildWindow : Window
    {
        public ChildWindow()
        {
            InitializeComponent();

            DataContext = new ChildWindowViewModel();

            this.Owner = App.Current.MainWindow;
        }
    }

저도 같은 문제가 있었어요하지만 그것은 대부분 제가 어린이 창문을 없애고 싶을 때, 제가 사용했다는 사실 때문이었습니다.hide()대신에close()다시 열 때 숨어서 닫히지 않았기 때문에 상위 창을 이동해도 시작 위치에서 계속 열립니다.

따라서 하위 창을 닫을 때(예: 작업이 완료되었을 때) 숨김 대신 닫힙니다.

이것을 야기할 수 있는 다른 무언가가 설정되어 있습니다.DataContext끝나고InitializeComponent()이 호출됩니다.

다음과 같은 코드백이 있는 경우:

    public CustomWindow(CustomViewModel viewModel)
    {
        InitializeComponent();
        DataContext = viewModel;
    }

다음으로 변경:

    public CustomWindow(CustomViewModel viewModel)
    {
        DataContext = viewModel;
        InitializeComponent();
    }

언급URL : https://stackoverflow.com/questions/3452854/wpf-windowstartuplocation-centerowner-not-really-center-and-pops-all-over-wh

반응형