C# WPF User Control Typname nicht vorhanden?
Hallo an alle Programmierfreunde da draußen!
Ich wollte mir gerne eine Custom User Control erstellen, weil ich sie in dieser Art und Weise in fast jeder WPF-App verwende.
Mein C# - Code:
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace MenuBar
{
public partial class MenuBar : UserControl
{
public List<string> Buttons;
public SolidColorBrush Background;
public SolidColorBrush Foreground;
public SolidColorBrush BorderBrush;
public Thickness BorderThickness;
public MenuBar(int winHeight)
{
InitializeComponent();
GridMenu.Height = winHeight;
GridMenu.HorizontalAlignment = HorizontalAlignment.Stretch;
GridMenu.VerticalAlignment = VerticalAlignment.Top;
}
public void Create()
{
ColumnDefinition c;
for (int i = 0; i <= Buttons.Count; i++)
{
c = new ColumnDefinition();
c.Width = new GridLength(GridMenu.Width / Buttons.Count);
GridMenu.ColumnDefinitions.Add(c);
}
Button btn;
int col = 0;
foreach (string s in Buttons)
{
btn = DefaultButton(s);
GridMenu.Children.Add(btn);
Grid.SetColumn(btn, col);
col++;
}
}
private Button DefaultButton(string title)
{
Button btn = new Button();
btn.Width = GridMenu.Width / Buttons.Count;
btn.Height = GridMenu.Height;
btn.Background = Background;
btn.Foreground = Foreground;
btn.Cursor = Cursors.Hand;
btn.BorderBrush = BorderBrush;
btn.BorderThickness = BorderThickness;
btn.Content = title;
return btn;
}
}
}
Mein XAML - Code:
<UserControl x:Class="MenuBar.MenuBar"
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"
xmlns:local="clr-namespace:MenuBar"
mc:Ignorable="d"
x:Name="Menu">
<Grid x:Name="GridMenu"></Grid>
</UserControl>
Abgesehen davon, dass ich nicht sicher sagen kann, dass der Code so funktioniert, bekomme ich schon beim Build eine Fehlermeldung:
MenuBar.xaml(9, 26): [CS0426] Der Typname "MenuBar" ist im Typ "MenuBar" nicht vorhanden.
Ich habe leider absolut keine Ahnung, wo der Fehler liegt, ich programmiere noch nicht so lange. Vielleicht kann mir jemand von euch helfen?
Das Projekt wurde als DesktopApplication im .NETCore v3.1 mit JetBrains Rider erstellt.
Danke für die Hilfe!
1 Antwort
Das Problem ist dein Klassen-Name, der ist identisch zum Namespace-Namen. Gib dem Control einen anderen Namen, dann gehts.
Ich persönlich nenne das meist "Control" oder ein "View", denn streng genommen ist das ja nicht die MenuBar selber, sondern nur das Control, mit dem ich dann mehrere MenuBars erstellen kann.
Ach und was Du da hast, ist kein "Custom Control", sondern ein "User Control", wichtiger Unterschied.
=======================
Außerdem hast Du noch ein paar andere Probleme mit dem Code.
WPF arbeitet mit DependencyProperty, die solltest Du dir dringend angucken. Du hast im CodeBehind aber public Properties, das ist ganz falsch, das müssen DependencyProperties sein, sonst kannst Du dafür keine Bindings definieren.
Dann sind diese Properties schon so oder so ähnlich vorhanden. Doppelte Properties sind auch immer eine blöde Idee.
Außerdem sollte ein Control keinen Konstruktor-Parameter haben, sonst kannst Du es nicht ohne Weiteres im XAML definieren.
Und deine merkwürdige String-Liste namens "Buttons" - damit kriegst Du 1. nur ein eindimensionales Menü hin und 2. sind Strings sehr stark eingeschränkt, Du kannst praktisch nichts an Funktionen erweitern.
Der erste Gedanke, wie ich das machen würde, wären zwei ViewModels, eins (oder mehrere mit Basisklasse) für das Menü selber und eins für die einzelnen Menü-Punkte. Letzteres kann sich selber enthalten, um tiefere Menüs zu ermöglichen.
Die View dazu stellt das dann nur noch dar, mit klugen Bindings geht das alles und dann bleibt auch dein CodeBehind völlig leer.
Schau dir auf jeden Fall MVVM an.
WPF kann man zwar ohne MVVM nutzen, aber verschenkt dabei viel Potential und wird auf Dauer nicht Glücklich damit.
Danke sehr, der Build hat jetzt schon einmal geklappt!
Das ist das erste Mal, dass ich eine User Control selbst erstelle und ich danke dir für deine Tipps und Vorschläge! Ich schaue mal, was ich davon umsetzen kann. Danke!