2

我正在尝试覆盖NavigationView行为:


    public partial class CustomizableNavigationView : NavigationView
    {
        public CustomizableNavigationView()
        {
            // This gets called
        }

        protected override void OnApplyTemplate()
        {
            // This doesn't

        }
    }

它适用于 UWP,但不适用于 Android。在 Android 上,它不调用 OnApplyTemplate 并且屏幕保持空白,没有内容。问题:

  1. 为什么在 Android 上不调用 OnApplyTemplate?我在这里看到:https ://platform.uno/docs/articles/implemented/windows-ui-xaml-frameworkelement.html 它说 OnApplyTemplate() 在所有平台上

  2. 使用调试器运行时,VS 的输出窗格中没有显示任何错误或任何内容。这种情况下应该有吗?我需要启用某些东西来记录错误吗?

  3. 我注意到如果我不使用partial它会给我错误提示partial是必需的。这仅在 Android 上是必需的,这是为什么呢?更深入的解释将有助于理解事物是如何工作的。

  4. 一旦我弄清楚为什么 OnApplyTemplate 没有被调用,我想这样做:

 base.OnApplyTemplate();
            var settingsItem = (NavigationViewItem)GetTemplateChild("SettingsNavPaneItem");
            settingsItem.Content = "Custom text";

我的预感是这不适用于Android。我对么?:)

4

2 回答 2

2

杰罗姆的回答解释了为什么OnApplyTemplate()没有被调用,以解决您的其他问题:

  1. 您可以为 Uno 配置日志过滤器,这通常在 App.xaml.cs中定义。默认情况下应记录警告。

  2. partial是必需的,因为 Uno 在幕后进行了一些代码生成,以创建 Xamarin 运行时使用的管道方法。特别是因为该控件最终继承自Android 上的ViewGroup,它是一个本机对象,并且需要仅由 Xamarin 的互操作层使用的特殊构造函数。有一些关于此的文档正在进行中。

  3. 试试看。:)GetTemplateChild()支持,并且支持ContentControl.Content以这种方式设置,所以我希望它可以工作。

于 2019-08-01T15:18:44.370 回答
2

在当前版本(1.45 及更低版本)中,样式应用的行为与 UWP 不同。我们将在本期中对此进行跟踪。

问题的要点是 Uno 使用当前类型而不是 解析样式DefaultStyleKey,并且找不到 的隐式样式CustomizableNavigationView

解决此问题的方法是从默认 NavigationView 样式创建命名样式,或者创建一个隐式样式CustomizableNavigationView用作 theTargetType而不是NavigationView

于 2019-08-01T13:58:01.040 回答