咨询:无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(此处为翻译后的名称)

内容的提问来源于stack exchange,提问作者Virgil Nauleau
相关产品推荐
相关产品推荐

