Приложение UWP с несколькими представлениями разных размеров - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть приложение UWP. Я хочу быть элем, чтобы создавать новые окна из приложения, но любое последующее окно должно иметь определенный меньший размер по сравнению с основным окном. Я ничего не делаю в отношении определения размера главного окна, и пусть ОС позаботится о том, чтобы он для меня изменился.

Я открываю новое окно, подобное этому:

auto window = CoreApplication::CreateNewView();
window->show();

void NewWindow::show() {
    auto currView = ApplicationView::GetForCurrentView();
    currView->PreferredLaunchViewSize =
        Windows::Foundation::Size(float(options.width), float(options.height));
    currView->PreferredLaunchWindowingMode = ApplicationViewWindowingMode::PreferredLaunchViewSize;
    currView->SetPreferredMinSize(Size(20,20));

    Xaml::Window::Current->Activate();

    ApplicationViewSwitcher::TryShowAsStandaloneAsync(
        window_->id(),
        ViewSizePreference::Default,
        window_->parentId(),
        ViewSizePreference::Default);
}

Когдаглавное окно появляется, оно появляется просто отлично. Когда я нажимаю кнопку, которая попадает в эту функцию, новое окно появляется в том же размере, что и главное окно. Я снова открываю приложение, но теперь главное окно отображается в том размере, в котором я хотел, чтобы новое окно отображалось. Затем, нажав кнопку, чтобы открыть новое окно, открывается новое окно в том размере, в котором я его хотел. Поэтому яЯ немного сбит с толку. Я правильно устанавливаю размеры? Здесь что-то явно не так?

1 Ответ

1 голос
/ 06 ноября 2019

Как сказал @ Raymond Chen, PreferredLaunchViewSize устанавливает размер при запуске приложения, оно изменит размер вашего главного окна. И вы можете использовать метод ApplicationView.TryResizeView , чтобы установить размер нового окна.

Например:

auto parentView = ApplicationView::GetForCurrentView();
auto newView = CoreApplication::CreateNewView();

newView->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal,
        ref new Windows::UI::Core::DispatchedHandler([this,parentView]()
{
    int newViewId = 0;
    Windows::UI::Xaml::Controls::Frame^ rootFrame = ref new Windows::UI::Xaml::Controls::Frame();
    rootFrame->Navigate(Windows::UI::Xaml::Interop::TypeName(MainPage::typeid), nullptr);
    Window::Current->Content = rootFrame;
    // You have to activate the window in order to show it later.
    Window::Current->Activate();

    newViewId = ApplicationView::GetForCurrentView()->Id;
    IAsyncOperation<bool>^ mytask = ApplicationViewSwitcher::TryShowAsStandaloneAsync(newViewId);
    auto deviceEnumTask = concurrency::create_task(mytask);
    deviceEnumTask.then([this](bool res)
    {
        // set the size of new window
        ApplicationView::GetForCurrentView()->TryResizeView(Size(600, 320));
    }); 
}));
...