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

咨询:无XAML的UserControl继承类如何让设计器正常渲染

问题:让WPF设计器渲染无XAML文件的UserControl子类

我想让WPF设计器能渲染一个继承自UserControl但没有对应XAML文件的类。这么做是因为有些页面共用通用代码,但外观完全不同。目前这个类运行没问题,但设计器没法渲染它;要是给这个类加XAML文件,又会提示根元素已定义,没法正常工作。

我定义了继承自UserControl的Menu_Type类,菜单的定义如下:

XAML代码(Main_Menu)

<Menu_Type x:Class="MyNameSpace.Main_Menu
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008">
    <Grid>//the content of my menu, that can completely differ</Grid>
</MenuType>

C#代码(Menu_Type)

namespace ComonLibrary.Views {
public class Menu_Type : UserControl {
    protected MainWindow window = (MainWindow)Application.Current.MainWindow.Content;
    protected MenuItem? selected;
    public int subMenuLevel;
    protected void SelectionMenuItemx(MenuItem menuItem) {
        if (selected != null) selected.Background = Brushes.WhiteSmoke;
        menuItem.Background = Brushes.LightSteelBlue;
        selected = menuItem;
    }
    public void NewContent(MenuItem item, Type type) {
        if (selected == item) return;
        if (item != null) SelectionMenuItemx(item);
        for (int i = subMenuLevel; i <= 4; i++) if (window.FindName("PnMenu" + i) is ContentControl c) c.Content = null;//Reset Menu de plus bas niveau si on reste au niveau du sender
        window.PnCentral.Content = Activator.CreateInstance(type);
    }
    public void NewMenu(MenuItem item, Type type) {
        if (selected == item) return;
        SelectionMenuItemx(item);
        window.PnCentral.Content = null; //Reset PnCentral si on descend d'un niveau
        for (int i = subMenuLevel + 1; i <= 4; i++) if (window.FindName("PnMenu" + i) is ContentControl cM) cM.Content = null;//Reset Menu de plus bas niveau que celui que l'on gère
        if (window.FindName("PnMenu" + subMenuLevel) is ContentControl c) {
            c.Content = Activator.CreateInstance(type);
            if (c.Content is Menu_Type m) m.subMenuLevel = subMenuLevel + 1;
        }
    }
    protected void Exit(object sender, RoutedEventArgs e) {
        window.PnCentral.Content = null;
        for (int i = subMenuLevel - 1; i <= 4; i++) if (window.FindName("PnMenu" + i) is ContentControl c) c.Content = null;
    }
    protected void Quit(object sender, RoutedEventArgs e) {
        System.Windows.Application.Current.Shutdown();
    }
}

注:Main_Menu即Menu_Principal(此处为翻译后的名称)

Menu_Type在Menu_Principal中的使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:09:51