【问题标题】:How to make the Drawer of RadSideDrawer cover the full page如何让 RadSideDrawer 的 Drawer 覆盖整个页面
【发布时间】:2023-03-29 23:08:01
【问题描述】:

我正在为 UWP 使用 telerik SizeDrawer 控件。在其中,我希望抽屉内容在打开时覆盖整页。因此,我尝试绑定到页面的 Actual-Width ,但这不起作用,然后我尝试使用 sizeChanged 事件注册它,但抽屉内容的宽度仍然保持为 0。除非我明确将其定义为像 300 这样的值,然后它仍然是 300,但我希望它覆盖全屏。

代码

<telerik:RadSideDrawer Name="MainDrawer" SizeChanged="MainDrawer_SizeChanged"
                       Loaded="MainDrawer_Loaded">
    <telerik:RadSideDrawer.MainContent>
        <Grid />

    </telerik:RadSideDrawer.MainContent>
    <telerik:RadSideDrawer.DrawerContent>
        <Grid  Name="DrawerGrid" Background="Yellow">

        </Grid>
    </telerik:RadSideDrawer.DrawerContent>
</telerik:RadSideDrawer>

C#

private void MainDrawer_SizeChanged(object sender, SizeChangedEventArgs e)
{
    DrawerGrid.Width = e.NewSize.Width;
}
private void MainDrawer_Loaded(object sender, RoutedEventArgs e)
{
    DrawerGrid.Width = MainDrawer.Width;
}

请注意,抽屉网格的高度还可以,可以拉伸到全屏,但宽度保持为 0,如果宽度完全保持不变,则固定为 240。

【问题讨论】:

  • 应该是MainDrawer.ActualWidth
  • 我对@9​​87654324@ 一无所知,但 xaml 在某种程度上旨在克服这些问题,无需触发任何事件。
  • @JustinXL 我试过了,但实际宽度也不起作用,它以某种方式覆盖了宽度
  • @Stefan 我知道我不需要触发事件,因为当我使用主抽屉的实际宽度绑定时它应该可以工作,但它仍然不起作用。

标签: c# xaml uwp telerik uwp-xaml


【解决方案1】:

这就是你的做法-

首先,定义一个double 属性,获取当前Window 的宽度。

public double WindowWidth => Window.Current.Bounds.Width;

然后将它用作您的RadSideDrawerDrawerLength一次性绑定源。

<primitives:RadSideDrawer x:Name="MainDrawer"
                          DrawerLength="{x:Bind WindowWidth}" ... />

最后,只要MainDrawer 的大小更新,就更新DrawerLength

private void MainDrawer_SizeChanged(object sender, SizeChangedEventArgs e) => 
    MainDrawer.DrawerLength = e.NewSize.Width;

另外注意如果你不想做绑定,可以用一行代码替换前两步,就在InitializeComponent();之后

MainDrawer.DrawerLength = Window.Current.Bounds.Width;

更新

看起来当抽屉折叠时,控件本身将其Opacity重置为1,然后当您不断更新DrawerLength时,抽屉边缘可能会露出并给用户带来不好的体验.

您可以尝试使用 Reactive Extensions 限制页面大小的变化,或者您可以简单地将抽屉的Opacity 设置回0,当它折叠时。

为此,您只需监视DrawerState 属性,当它为Closed 时,将DrawerGrid.Opacity 设置为0

但请记住,您还需要将其设置回1,然后才能扩展它。不幸的是,没有Opening 状态并且Opened 触发太晚,因此您必须找到菜单按钮并在其Click 事件中执行此操作。

public MainPage()
{
    InitializeComponent();

    MainDrawer.DrawerLength = Window.Current.Bounds.Width;

    Loaded += (s, e) =>
    {
        // GetChildByName: https://github.com/JustinXinLiu/Continuity/blob/master/Continuity/Extensions/UtilExtensions.cs#L44
        var menuButton = MainDrawer.GetChildByName<Button>("PART_SideDrawerButton");
        menuButton.Click += (s1, e1) => DrawerGrid.Opacity = 1;
    };

    MainDrawer.RegisterPropertyChangedCallback(RadSideDrawer.DrawerStateProperty, (s, e) =>
    {
        var state = MainDrawer.DrawerState;

        if (state == DrawerState.Closed)
        {
            DrawerGrid.Opacity = 0;
        }
    });
}

【讨论】:

  • 我有一个问题,我按照你的方法,现在当我将窗口调整为更小的屏幕然后再次调整为更大的窗口时,它不能正常工作,然后抽屉长度的宽度是完美,但是当我用“MainDrawer.HideDrawer()”关闭抽屉时,只有部分抽屉隐藏,大约 70% 的抽屉留在屏幕上。你能告诉我为什么会这样吗?同时它适用于较小的窗口。
  • 尝试通过注册属性检查回调 (RegisterPropertyChangedCallback) 来监控抽屉宽度 n 每当窗口宽度发生变化时都会覆盖它。
  • 不,正如我所说的抽屉宽度很好。因为我什至检查了 XAML 调试器,并且抽屉的宽度仍然是 1366(这是我的窗口的宽度)但是一旦应用程序从小窗口调整大小 - > 大窗口,那么关闭的抽屉在屏幕上仍然保持大约 70%,实际上通常应该完全滑出屏幕,但在这种情况下,它会滑出 30%,而 70% 仍留在屏幕上,当我再次显示抽屉时,抽屉的剩余 30% 会再次滑入。
  • 如果应用程序在全窗口启动,那么它可以完美运行,并且在较小的窗口中也可以正常运行,只有当应用程序从小窗口调整到大窗口时才会出现问题。 (但即使在多次调整大小后,它仍然可以在较小的窗口中正常工作)
  • 您是否还使用了 xaml 调试器来查看哪个元素没有拉伸到全屏尺寸?
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
相关资源
最近更新 更多