【问题标题】:How to reduce the width of hamburger menu in xamarin forms uwp platform如何减少xamarin forms uwp平台中汉堡菜单的宽度
【发布时间】:2019-09-09 15:13:50
【问题描述】:

我使用主详细信息页面在 xamarin 表单中创建了一个汉堡菜单。但是我无法在 uwp 平台中减小汉堡菜单的宽度。请让我知道是否有办法减小宽度或者它是汉堡菜单占用的默认宽度。

这是主页面的代码:

<MasterDetailPage.Master>
    <local:SideDrawerListPage x:Name="sideDrawerListPage" WidthRequest="100" />
</MasterDetailPage.Master>

侧抽屉列表代码:

 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid Grid.Row="0">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="120" />
        </Grid.RowDefinitions>
        <Image Grid.Row="0"  Source="menu.png" HorizontalOptions="Center" WidthRequest="100" HeightRequest="60" Margin="0,2,0,0"/>
    <Grid Grid.Row="1" Padding="20" Margin="5,0,0,0" ColumnSpacing="0" RowSpacing="0" HeightRequest="75">
        <Grid.RowDefinitions>
            <RowDefinition Height="75"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="2*"/>
        </Grid.ColumnDefinitions>            
              ------------------
    </Grid>

    <Grid Grid.Row="2" BackgroundColor="{Binding SelectedBackgroundColorA}" HeightRequest="45" RowSpacing="0" ColumnSpacing="0">         
        --------
    </Grid>
    <Grid Grid.Row="3" BackgroundColor="{Binding SelectedBackgroundColorB}" HeightRequest="45" RowSpacing="0" ColumnSpacing="0">
        --------           
    </Grid>
    <Grid Grid.Row="4">
            <ListView x:Name="listView" VerticalOptions="FillAndExpand" Margin="0,-8,0,-10" IsVisible="{Binding IsChildListVisible}" x:FieldModifier="public" ItemsSource="{Binding DashboardListItems}" BackgroundColor="#3c4a56">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <!--BackgroundColor="{Binding SelectedBackgroundColor}"-->
                            <Grid BackgroundColor="#3c4a56">
                        <Grid.GestureRecognizers>
                            <TapGestureRecognizer NumberOfTapsRequired="1" Command="{Binding Command}" CommandParameter="{Binding}"></TapGestureRecognizer>
                        </Grid.GestureRecognizers>
                        <Grid RowSpacing="0" ColumnSpacing="0">
                            ----------------
                        </Grid>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    </Grid>
    </Grid>

感谢任何帮助!

【问题讨论】:

    标签: xamarin.forms uwp master-detail


    【解决方案1】:

    xamarin forms uwp平台如何减小汉堡菜单的宽度

    与MasterDetailPage 匹配的控件是UWP 平台内的MasterDetailControl。它有风格资源。根据您的要求,您可以修改MasterDetailControl 的样式并减小PaneTogglePane 和ContentTogglePane 按钮的宽度。我会把完整的样式贴出来,你可以直接使用。

    <Application.Resources>
        <ResourceDictionary>
            <Style TargetType="uwp:MasterDetailControl">
                <Setter Property="ToolbarForeground" Value="{ThemeResource DefaultTextForegroundThemeBrush}" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="uwp:MasterDetailControl">
                            <SplitView x:Name="SplitView" IsPaneOpen="{Binding IsPaneOpen,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}" DisplayMode="Overlay">
                                <SplitView.Pane>
                                    <Grid>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto" />
                                            <RowDefinition Height="*" />
                                        </Grid.RowDefinitions>
                                        <StackPanel Grid.Row="0" Orientation="Horizontal" Visibility="{TemplateBinding MasterToolbarVisibility}"  Background="{TemplateBinding ToolbarBackground}">
                                            <Button Name="PaneTogglePane" Style="{ThemeResource PaneButton}" Width="30" Foreground="{TemplateBinding ToolbarForeground}"
                                            AutomationProperties.Name="{Binding Path=(AutomationProperties.Name), RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"  
                                            AutomationProperties.HelpText="{Binding Path=(AutomationProperties.HelpText), RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"  
                                            AutomationProperties.LabeledBy="{Binding Path=(AutomationProperties.LabeledBy), RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"  
                                            AutomationProperties.AccessibilityView="{Binding Path=(AutomationProperties.AccessibilityView), RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"  />
                                            <TextBlock Margin="10,0,0,0" Style="{ThemeResource TitleTextBlockStyle}" VerticalAlignment="Center" Text="{TemplateBinding MasterTitle}" Visibility="{TemplateBinding MasterTitleVisibility}" Foreground="{TemplateBinding ToolbarForeground}"/>
                                        </StackPanel>
                                        <ContentPresenter x:Name="MasterPresenter" Grid.Row="1" Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Master}" />
                                    </Grid>
                                </SplitView.Pane>
                                <SplitView.Content>
                                    <Grid>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto" />
                                            <RowDefinition Height="*" />
                                            <RowDefinition Height="Auto" />
                                        </Grid.RowDefinitions>
    
                                        <Border x:Name="TopCommandBarArea" HorizontalAlignment="Stretch" Background="{TemplateBinding ToolbarBackground}">
                                            <uwp:FormsCommandBar x:Name="CommandBar" Background="{TemplateBinding ToolbarBackground}" MinHeight="{ThemeResource TitleBarHeight}" HorizontalAlignment="Stretch">
                                                <uwp:FormsCommandBar.Content>
                                                    <Border x:Name="TitleArea" Height="{ThemeResource TitleBarHeight}" Visibility="{TemplateBinding DetailTitleVisibility}" HorizontalAlignment="Stretch">
                                                        <Grid x:Name="TitleViewPresenter" VerticalAlignment="Center" Background="{TemplateBinding ToolbarBackground}" HorizontalAlignment="Stretch">
    
                                                            <Grid.ColumnDefinitions>
                                                                <ColumnDefinition Width="Auto"/>
                                                                <ColumnDefinition Width="Auto"/>
                                                                <ColumnDefinition Width="Auto"/>
                                                                <ColumnDefinition Width="*"/>
                                                            </Grid.ColumnDefinitions>
    
                                                            <Button Grid.Column="0" Width="30" Name="ContentTogglePane" Style="{ThemeResource PaneButton}" Foreground="{TemplateBinding ToolbarForeground}"  
                                                            Visibility="{TemplateBinding ContentTogglePaneButtonVisibility}" />
    
                                                            <Image Grid.Column="1" Source="{TemplateBinding DetailTitleIcon}" />
    
                                                            <Border Grid.Column="2" Height="{ThemeResource TitleBarHeight}" Visibility="{TemplateBinding DetailTitleVisibility}">
                                                                <TextBlock Text="{TemplateBinding DetailTitle}" VerticalAlignment="Center" Margin="10,0,0,0" Foreground="{TemplateBinding ToolbarForeground}" Style="{ThemeResource TitleTextBlockStyle}" />
                                                            </Border>
    
                                                            <ContentPresenter Grid.Column="3" Content="{Binding DetailTitleView, RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource ViewToRenderer}}" Visibility="{TemplateBinding DetailTitleViewVisibility}" HorizontalAlignment="Stretch" />
    
                                                        </Grid>
                                                    </Border>
                                                </uwp:FormsCommandBar.Content>
                                            </uwp:FormsCommandBar>
                                        </Border>
    
                                        <ContentPresenter x:Name="DetailPresenter" Grid.Row="1" Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Detail}" />
    
                                        <Border x:Name="BottomCommandBarArea" Grid.Row="2" HorizontalAlignment="Stretch"></Border>
                                    </Grid>
                                </SplitView.Content>
                            </SplitView>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </Application.Resources>
    

    更新

    抱歉,如果您想减少汉堡菜单,我想了解您的要求。您可以在上述样式中为SplitView 设置OpenPaneLength。

     ......
     <ControlTemplate TargetType="uwp:MasterDetailControl">
     <SplitView OpenPaneLength="100" x:Name="SplitView" 
     ......
    

    请注意,我们需要在 uwp App.Xaml 中放置上述样式。

    【讨论】:

    • 上述解决方案对我不起作用。我需要为此创建一个渲染器吗?
    • 不行,只要把上面的样式放到uwp App.Xaml文件中就可以了。
    • @Mars,如果你愿意,我可以分享样品。
    • 这是代码示例link。
    • 我尝试了您的解决方案。减小 PaneTogglePane 和 ContentTogglePane 按钮的宽度并不是在打开时减小汉堡菜单的宽度。在打开状态下仍然占用默认宽度。
    【解决方案2】:

    需要“TitleViewPresenter”或其子项的定义,或者在默认情况下从here 覆盖内容时将返回 null... 从而导致 MasterDetailControl.cs 崩溃

    _titleViewPresenter = GetTemplateChild("TitleViewPresenter") as FrameworkElement;
    

    Xaml:

     <ContentPresenter x:Name="TitleViewPresenter" Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DetailTitleView}" />
    

    【讨论】:

      猜你喜欢
      • 2019-04-19
      • 2018-12-22
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      相关资源
      最近更新 更多