【问题标题】:how to make uwp flyout full screen如何使uwp弹出全屏
【发布时间】:2019-01-15 13:15:23
【问题描述】:

我正在为平板电脑创建一个应用程序,它将显示一个充满数据的网格。我希望能够单击每个项目,然后将该数据显示在弹出窗口或弹出窗口或其他对话框中,以便我可以像表单一样对其进行编辑。到目前为止,我正在使用一个弹出窗口,其中包含这样的堆栈面板:

            <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Margin="10 0 10 0">
    <GridView ItemsSource="{x:Bind Activities}" ItemsPanel="{StaticResource ResourceKey=ItemsPanelTemplate}">
        <GridView.ItemContainerStyle>
            <Style TargetType="GridViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            </Style>
        </GridView.ItemContainerStyle>
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="model:TimActivity">
                <Grid Tapped="GridView_Tapped">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1*" />
                        <ColumnDefinition Width="1*" />
                        <ColumnDefinition Width="1*" />
                        <ColumnDefinition Width="1*" />
                        <ColumnDefinition Width="1*" />
                        <ColumnDefinition Width="2*" />
                        <ColumnDefinition Width="1*" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Text="{x:Bind Path=Type, Converter={StaticResource TimActivityTypeToStringConverter}}" />
                    <TextBlock Grid.Column="1" Text="{x:Bind StartTime}" />
                    <TextBlock Grid.Column="2" Text="{x:Bind EndTime}" />
                    <TextBlock Grid.Column="3" Text="{x:Bind From}" />
                    <TextBlock Grid.Column="4" Text="{x:Bind To}" />
                    <TextBlock Grid.Column="5" Text="{x:Bind Comment}" />
                    <TextBlock Grid.Column="6" Text="{x:Bind Path=Chargeable, Converter={StaticResource BoolToStringConverter}}" />
                    <FlyoutBase.AttachedFlyout>
                        <Flyout Placement="Full">
                            <StackPanel>
                                        <TextBlock Text="Activity"/>
                                        <TextBox  Text="{x:Bind Path=Type, Converter={StaticResource TimActivityTypeToStringConverter}}" />
                                        <TextBlock Text="Start Time"/>
                                        <TextBox  Text="{x:Bind StartTime}" />
                                        <TextBlock Text="End Time"/>
                                        <TextBox  Text="{x:Bind EndTime}" />
                                        <TextBlock Text="From"/>
                                        <TextBox  Text="{x:Bind From}" />
                                        <TextBlock Text="To"/>
                                        <TextBox  Text="{x:Bind To}" />
                                        <TextBlock Text="Comment"/>
                                        <TextBox  Text="{x:Bind Comment}" />
                                        <TextBlock Text="Chargeable?"/>
                                        <TextBox  Text="{x:Bind Path=Chargeable, Converter={StaticResource BoolToStringConverter}}" />
                            </StackPanel>
                        </Flyout>
                    </FlyoutBase.AttachedFlyout>
                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
</Grid>

我将Placement 设置为Full,但它只会垂直拉伸弹出窗口,而不是全屏。你能告诉我一个。弹出是对此的正确控制,并且b。如何让它全屏?

【问题讨论】:

  • StackPanel 绝不会允许超出其需要的空间。尝试使用 GridRowDefinitions,这将允许 Children 正确间隔。
  • Flyout 的目的就是只使用其子控件所需的空间!如果你想为你的项目创建一个“编辑页面”,那么只需在你的应用中实现一个导航系统......或者只是一个主从页面。
  • 感谢@LucaLindholm。我去看看。

标签: c# uwp uwp-xaml


【解决方案1】:
<Flyout Placement="Full">

这是最好的方法,即使它不会横向拉伸 您还可以启用 LightDismissOverlayMode,以获得更“模态”的选项体验。

全屏弹出没有任何意义,如果不添加更多退出按钮,您甚至无法将其关闭。

但如果你真的想这样做,你可以使用 Popup,它是 FlyoutBase 的一个更原始的产品,然后你可以绑定到它实际的 Width 和包含页面的高度,例如:

<Popup   Height="{Binding yourpage.ActualHeight}"  Width="{Binding yourpage.ActualWidth}" />
<Button Background="Orange" Height="50" Width=50 />

Popup 由其 IsOpen 属性控制显示,因此请相应地进行调整。

在架构方面,如果您使用与单击的任何项目动态关联的单个弹出窗口会更合适。

喜欢:

YourListview.ItemClicked+=(e,z)=>{ yourSingleFlyout.ShowAt(ElementClicked)};

或者,就像其他人建议的那样,您可以使用 Multiview 系统,尽管我个人认为这种 UI 设计与 windows 手机一样死气沉沉。

此外,仅出于提供信息的原因,Microsoft 最近在最新的 api 更新中扩展了 Flyout 实体的 Placement 枚举,但我认为那里没有什么可以帮助您。

【讨论】:

  • 感谢您的详细回复。实际上,我并不真的需要全屏天桥,我只需要让它更宽,文本框、字体等更大的能力。相对于屏幕宽度,我将如何响应地增加宽度?
  • 这是一个非常棘手的问题,windows会根据屏幕和设备自动缩放ui,所以......
【解决方案2】:

根据您的要求,我们建议您使用ConnectedAnimation 来接近。更多步骤请参考此代码sample

private void TipsGrid_ItemClick(object sender, ItemClickEventArgs e)
{
    ConnectedAnimation animation = null;

    // Get the collection item corresponding to the clicked item.
    var container = collection.ContainerFromItem(e.ClickedItem) as GridViewItem;
    if (container != null)
    {
        // Stash the clicked item for use later. We'll need it when we connect back from the detailpage.
        _storedItem = Convert.ToInt32(container.Content);

        // Prepare the connected animation.
        // Notice that the stored item is passed in, as well as the name of the connected element. 
        // The animation will actually start on the Detailed info page.
        animation = collection.PrepareConnectedAnimation("forwardAnimation", _storedItem, "connectedElement");

    }

    SmokeGrid.Visibility = Visibility.Visible;
   // SmokeGrid.DataContext = e.ClickedItem;
    animation.TryStart(destinationElement);
}

更新

然后我应该能够编辑该表单中的所有字段,保存后,它会反映在网格中。

您可以制作继承INotifyPropertyChanged的模型,然后使用双向绑定将模型属性与xaml代码绑定。

<GridView Name="collection" ItemClick="Conllection_ItemClick" IsItemClickEnabled="True">
    <GridView.ItemTemplate>
        <DataTemplate>
            <Grid x:Name="connectedElement"  Height="100" Width="100" Background="Orange">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <TextBlock Text="{Binding Title}" 
                           VerticalAlignment="Center"
                           HorizontalAlignment="Center"
                           TextAlignment="Center"/>
                <TextBlock Grid.Row="1" Text="{Binding Content,Mode=TwoWay}" 
                           VerticalAlignment="Center"
                           HorizontalAlignment="Center"
                           TextAlignment="Center"/>

            </Grid>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

您可以在GridView ItemClick 时将项目传递到弹出网格。

private void Conllection_ItemClick(object sender, ItemClickEventArgs e)
{
    ConnectedAnimation animation = null;
    var container = collection.ContainerFromItem(e.ClickedItem) as GridViewItem;
    if(container != null)
    {
        _storedItem = container.Content;
        animation = collection.PrepareConnectedAnimation("forwardAnimation", _storedItem, "connectedElement");
    }
    SmokeGrid.Visibility = Visibility.Visible;
   // pass the item DataContext.
    SmokeGrid.DataContext = e.ClickedItem;

    animation.TryStart(destinationElement);
}

迷你sample更新了,可以参考一下。

【讨论】:

  • 感谢@Nico Zhu 的回复,但我不太关心动画,更希望能够在一个单独的弹出表单中编辑一个网格项目,该表单在单击项目时堆叠在顶部.然后我应该能够编辑该表单中的所有字段,保存后,它会反映在网格中。
  • 非常感谢尼科。我会试一试,然后告诉你。
猜你喜欢
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多