You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Avalonia Android平台下如何正确获取视图的尺寸?

解决Avalonia Android应用中视图宽度读取问题

1. 改用LayoutUpdated事件替代Loaded

Loaded触发时控件布局尚未完成,因此Width会返回NaN。LayoutUpdated会在布局计算完成(或布局变更)后触发,此时能获取到正确尺寸:

public MainView()
{
    InitializeComponent();
    LayoutUpdated += MainView_LayoutUpdated;
}

private void MainView_LayoutUpdated(object? sender, EventArgs e)
{
    // 仅首次布局完成后获取一次,避免重复触发
    if (ActualWidth > 0)
    {
        Console.WriteLine($"实际宽度:{ActualWidth}");
        LayoutUpdated -= MainView_LayoutUpdated;
    }
}

2. 强制触发布局计算

如果必须在Loaded中获取宽度,可手动调用Measure和Arrange强制完成布局:

private void MainView_Loaded(object? sender, RoutedEventArgs e)
{
    // 测量控件所需尺寸
    Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
    // 执行布局排列
    Arrange(new Rect(0, 0, DesiredSize.Width, DesiredSize.Height));
    
    // 此时可读取正确的宽度值
    Console.WriteLine($"强制计算后宽度:{ActualWidth}");
}

3. 通过平台特定代码获取原生控件尺寸

若需调用Android原生API获取尺寸,可在MainView中获取原生控件句柄后执行操作:

using Avalonia.Platform;
using Android.Views;

private void MainView_Loaded(object? sender, RoutedEventArgs e)
{
    if (this.TryGetPlatformHandle(out var handle) && handle.Handle != IntPtr.Zero)
    {
        var androidView = View.FromHandle(handle.Handle);
        // 延迟执行确保布局完成
        androidView.Post(() =>
        {
            int nativeWidth = androidView.Width;
            float density = androidView.Resources.DisplayMetrics.Density;
            // 转换为Avalonia使用的设备无关单位(DIP)
            double avaloniaWidth = nativeWidth / density;
            Console.WriteLine($"原生控件宽度(DIP):{avaloniaWidth}");
        });
    }
}

在MainActivity中,可等待Avalonia应用初始化完成后操作根视图:

protected override void OnCreate(Bundle? savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    AvaloniaApp.Current.FrameworkInitializationCompleted += (s, e) =>
    {
        if (AvaloniaApp.Current.MainWindow?.Content is MainView mainView)
        {
            mainView.Loaded += (sender, args) =>
            {
                // 在这里执行尺寸获取逻辑
            };
        }
    };
}

注意事项

  • 优先使用ActualWidth而非Width,前者是控件实际渲染后的宽度,更可靠。
  • 避免在控件初始化阶段直接读取尺寸,确保布局流程完成后再操作。

内容的提问来源于stack exchange,提问作者cboittin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:12:33