如何更改XAML弹出窗口的大小?

时间:2020-03-19 08:08:52

标签: xaml uwp c++-cx

在我看来,弹出量的计算不正确。

<AppBarButton>
    <AppBarButton.Flyout>
        <Flyout>
            <ListView>
                <x:String>Short</x:String>
                <x:String>Very very very long</x:String>
                <x:String>Short</x:String>
                <x:String>Short</x:String>
                <x:String>Short</x:String>
                <x:String>Short</x:String>
                <x:String>Short</x:String>
                <x:String>Short</x:String>
            </ListView>
        </Flyout>
    </AppBarButton.Flyout>
</AppBarButton>

如果窗口的高度足够大-一切都很好。 但是,如果不是这样-弹出宽度是根据第一个元素(不是最大元素)计算的,我看到以下内容:

The second item is clipped

如何从代码(或XAML)更改Flyout的宽度?

编辑:

以下代码有效:

auto w = filesListView->ActualWidth.ToString();
Windows::UI::Xaml::Style^ s = ref new Windows::UI::Xaml::Style();
s->Setters->Append(ref new Setter(MinWidthProperty, w));
myFlyout->FlyoutPresenterStyle = s;

我试图将其放入Flyout.Opening(),Flyout.Opened(),ListView.SizeChanged(),ListView.Loaded(),ListView.Loading(),ListView.LayoutUpdated()。问题是它从第二个调用开始起作用。在第一个调用弹出按钮中,仍使用错误的宽度进行渲染。

3 个答案:

答案 0 :(得分:1)

您可以更改ListView宽度以更改弹出窗口宽度

APPROACH 1

我将所有代码都放在了github上,欢迎您访问

另一种方法是设置FlyoutPresenterStyle

    <AppBarButton Margin="10,10,10,10">
        <AppBarButton.Flyout>
            <Flyout>
                <ListView Width="500">
                    <x:String>Short</x:String>
                    <x:String>Very very very long</x:String>
                    <x:String>Short</x:String>
                    <x:String>Short</x:String>
                    <x:String>Short</x:String>
                    <x:String>Short</x:String>
                    <x:String>Short</x:String>
                    <x:String>Short</x:String>
                </ListView>
            </Flyout>
        </AppBarButton.Flyout>
    </AppBarButton>

请参见https://stackoverflow.com/a/54902492/6116637

我还将所有代码都放在github上,欢迎访问。

答案 1 :(得分:1)

我设法通过将弹出控件最初附加到另一个元素并覆盖Flyout.Opened()来更改弹出控件的大小,在此处计算出正确的宽度并将弹出控件附加到正确的元素上。

XAML代码:

<Page.Resources>
    <Flyout x:Name="myFlyout" Opened="myFlyoutOpened">
        <ListView x:Name="filesListView">
            <x:String>Short</x:String>
            <x:String>Very very very long</x:String>
            <x:String>Short</x:String>
            <x:String>Short</x:String>
            <x:String>Short</x:String>
            <x:String>Short</x:String>
            <x:String>Short</x:String>
            <x:String>Short</x:String>
        </ListView>
    </Flyout>
</Page.Resources>
<StackPanel>
    <AppBarButton x:Name="myButton" Click="MyButton_Click"/>
    <AppBarButton x:Name="SecondButton"/>
</StackPanel>

C ++代码:

void App4::MainPage::MyButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    auto flyout = static_cast<Flyout^>(Resources->Lookup(L"myFlyout"));
    flyout->ShowAt(SecondButton);
}

void App4::MainPage::myFlyoutOpened(Platform::Object^ sender, Platform::Object^ e)
{
    auto w = filesListView->ActualWidth.ToString();
    Windows::UI::Xaml::Style^ s = ref new Windows::UI::Xaml::Style();
    s->Setters->Append(ref new Setter(MinWidthProperty, w));
    myFlyout->FlyoutPresenterStyle = s;
    myFlyout->ShowAt(myButton);
}

答案 2 :(得分:0)

我找到了另一种解决方案:足以填充ListView的MaxHeight属性:

void App4::MainPage::MyButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    filesListView->MaxHeight = Window::Current->Content->ActualSize.y - 50;
    auto flyout = static_cast<Flyout^>(Resources->Lookup(L"myFlyout"));
    flyout->ShowAt(SecondButton);
}