XAML 创建从代码中继承NavigationView的控件在加载时引发异常

2ul0zpep  于 2023-05-27  发布在  其他
关注(0)|答案(2)|浏览(114)
<!--MainWindow.xaml-->

<Window x:Class="TestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" />
// MainWindow.xaml.cs

namespace TestApp
{
    internal sealed partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}
// App.xaml.cs

namespace TestApp
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();
        }

        protected override void OnLaunched(LaunchActivatedEventArgs args)
        {
            var mainWindow = new MainWindow();
            mainWindow.Content = new SubControl();
            mainWindow.Activate();
        }
    }
}
// SubControl.cs

namespace TestApp.Controls
{
    internal class SubControl : NavigationView
    {
    }
}

上述代码在加载SubControl时导致异常。
e.Exception:{“未检测到已安装的组件。(0x800F1000)"},System.Exception {System.Runtime.InteropServices.COMException}
e.消息:“无法将TargetType为'Microsoft.UI.Xaml.Controls.NavigationView'的样式应用于类型为'Microsoft.UI.Xaml.Controls. ContentControl'的对象。”
如果SubControl是从xaml创建的,或者继承了Button、TextBox、CheckBox等,它将正常工作。
我尝试做的是创建一个继承NavigationView的自定义控件。为了实现我想要定制的部分,我认为使用子类比应用Behavior更好。
将断点应用于“mainWindow.Content = new SubControl();”时引发异常“.
如果不应用断点,则没有异常,但不显示控件。

dced5bon

dced5bon1#

你可以用另一个没有 Default____Style 的控件得到同样的行为(例如 DefaultButtonStyle)。
目前我能想到的唯一解决方法是从generic.xaml中引入样式,并将TargetType更改为 SubControl

<Style TargetType="local:SubControl">
    <Setter Property="PaneToggleButtonStyle" Value="{StaticResource PaneToggleButtonStyle}" />
    <Setter Property="IsTabStop" Value="False" />
    <Setter Property="CompactPaneLength" Value="{ThemeResource NavigationViewCompactPaneLength}" />
    <Setter Property="CornerRadius" Value="{ThemeResource OverlayCornerRadius}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:SubControl">
:
:
:
</Style>
tnkciper

tnkciper2#

@AndrewKeepCoding正在尝试解析Control.DefaultStyleKey。在最简单的情况下,您可以使用NavigationView样式。只需添加一个新的自定义控件并替换以下代码。

// Copyright (c) Microsoft Corporation and Contributors.
// Licensed under the MIT License.

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Documents;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;

// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.

namespace App2CSharp
{
    public sealed class CustomControl1 : NavigationView
    {
        public CustomControl1()
        {
            this.DefaultStyleKey = typeof(NavigationView);
        }

        protected override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
        }
    }
}

相关问题