Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von DeSharper
Thema: Prism Navigation: Region liegt in anderem Projekt
Am im Forum: GUI: WPF und XAML

Problem gefunden, es lag daran, dass ich CustomControls verwende, die keinen eigenen xaml-Code haben, sondern diesen immer per ControlTemplate aus dem ResourceDictionary bekommen (siehe Code oben).
Deswegen muss ich den RegionManager von Hand nochmal setzen und zwar erst dann, wenn das Template tatsächlich angewendet wird:


    public class MainWindowShell : Window
    {
        static MainWindowShell()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MainWindowShell), new FrameworkPropertyMetadata(typeof(MainWindowShell)));
        }

        private IRegionManager _regionManager;

        public MainWindowShell(IMainMenuViewModel viewModel, IRegionManager regionManager)
        {
            this.DataContext = viewModel;
            _regionManager = regionManager;
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            var contentControl = GetTemplateChild("ShellContent");
            RegionManager.SetRegionManager(contentControl, _regionManager);

        }
    }
Natürlich muss der Name "ShellContent" im Template auch gesetzt sein, sonst fliegt hier ne Exception.

Übrigens ist das Hinzufügen des Projekts zum ModuleCatalog nicht notwendig gewesen. Das geht auch ohne.

Thema: Prism Navigation: Region liegt in anderem Projekt
Am im Forum: GUI: WPF und XAML

Wenn ich OnInitialized aus dem ViewModul rausnehme wird das Interface "IModule" nicht mehr implementiert. Das RequestNavigate habe ich in beiden OnInitialized-Methoden ausprobiert. Hab ich bei dir gesehen und dachte, das spart mir vielleicht das klicken beim Testen :-)

Zu "InitializeShell": Jetzt verstehe ich, was du meinst. Ich habe einfach eine persönliche Abneigung gegen "Autowire", weil es mir nicht gefällt, wenn meine Klassen irgendwelchen Namenskonventionen entsprechen müssen. Als ich mit Prism angefangen hab, hat das auch nicht so richtig funktioniert, kann aber sein, dass ich damals noch andere Probleme drin hatte. Jedenfalls hab ich dann das AutoWire rausgeschmissen und mich nicht mehr weiter mit dem Feature beschäftigt. Aber davon abgesehen wird ja auch alles richtig verdrahtet. Die Views haben alle die richtigen ViewModels und ich laufe beim Debuggen ja auch in den Command-Code rein. Nur das RequestNavigate funktioniert nicht, möglicherweise weil bei mir NICHTS in regionManager.Regions steht.

Die Doku nutze ich natürlich, insbesondere den Teil zur Navigation. Aber ich finde einfach keinen Grund, warum es bei mir nicht funktioniert.
Was mich interessieren würde wäre, wann und wie die Region dem regionManager hinzugefügt wird, denn genau das scheint ja bei mir nicht zu passieren. Aber darüber hab ich in der Doku noch nichts gefunden. Und was ich auch nicht verstehe, wenn es die region gar nicht gibt, wieso kann dann überhaupt initial was angezeigt werden?

Thema: Prism Navigation: Region liegt in anderem Projekt
Am im Forum: GUI: WPF und XAML

Ich wollte keine Codewüste posten, aber wenn es hilft:
App.xaml.cs im Startup-Projekt


    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindowShell>();
        }

        protected override void InitializeShell(Window shell)
        {
            var mainWindow = (MainWindowShell)shell;
            MainWindow = mainWindow;
            mainWindow.Show();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterSingleton<IMainMenuViewModel, MainMenuViewModel>();
        }

        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            moduleCatalog.AddModule<ViewModul>();
        }
    }
Modul im View-Projekt


    public class ViewModul : IModule
    {
        private readonly IRegionManager _regionManager;

        public ViewModul(IRegionManager regionManager)
        {
            _regionManager = regionManager;
        }

        public void OnInitialized(IContainerProvider containerProvider)
        {
            _regionManager.RequestNavigate(RegionNames.Content, ViewNames.GraphicMenu);
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<GraphicMenu>(ViewNames.GraphicMenu);
            containerRegistry.RegisterForNavigation<MainMenu>(ViewNames.MainMenu);

            _regionManager.RegisterViewWithRegion(RegionNames.Content, typeof(MainMenu));
        }
    }
Shell.xaml im View-Projekt (liegt in einem ResourceDictionary)

  <Style TargetType="{x:Type userControls:MainWindowShell}">
    <Setter Property="Template" Value="{DynamicResource MainWindowShell}" />
  </Style>

  <ControlTemplate x:Key="MainWindowShell" TargetType="{x:Type userControls:MainWindowShell}">
      <Grid>
      <ContentControl regions:RegionManager.RegionName="{x:Static utilities:RegionNames.Content}">
      </ContentControl>
      </Grid>
  </ControlTemplate>
MainWindowShell.cs im View-Projekt


    public class MainWindowShell : Window
    {
        static MainWindowShell()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MainWindowShell), new FrameworkPropertyMetadata(typeof(MainWindowShell)));
        }

        public MainWindowShell(IMainMenuViewModel viewModel)
        {
            this.DataContext = viewModel;
        }
    }
MainMenu.xaml im View-Projekt (liegt in einem ResourceDictionary)

  <Style TargetType="{x:Type pages:MainMenu}">
    <Setter Property="Template" Value="{DynamicResource MainMenu}"/>
  </Style>

  <ControlTemplate x:Key="MainMenu" TargetType="{x:Type pages:MainMenu}">
    <Grid >
      <Button Content="Grafikoptionen" 
              Command="{Binding NavigateCommand}" 
              CommandParameter="{x:Static utilities:ViewNames.GraphicMenu}"/>
    </Grid>
  </ControlTemplate>
MainMenu.cs im View-Projekt


    public class MainMenu : Control
    {
        static MainMenu()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MainMenu), new FrameworkPropertyMetadata(typeof(MainMenu)));
        }

        public MainMenu(IMainMenuViewModel viewModel)
        {
            this.DataContext = viewModel;
        }
    }

Um Vertipper auszuschließen habe ich jetzt sowohl den Namen der Region als auch die Bezeichner für die Views in statische Klassen ausgelagert. Die Registrierung der Views ist denke ich auch in Ordnung. Ich habs jetzt nochmal mit deinem Beispiel verglichen, aber du machst ja auch nichts anders, außer dass du eindeutige Bezeichner verwendest. Das habe ich ergänzt.
Ich habe auch schon versucht die Navigation ins OnInitialized des Moduls zu verschieben, hat auch nichts geholfen. Ich weiß langsam echt nicht mehr weiter. Ich kann das Projekt auch nicht mehr weiter abspecken, ist ja nix mehr drin.
Zitat
"InitializeShell":
Hier registrierst du Sachen, die nichts mit der eigentlichen Initialisierung der Shell zu tun haben, oder?
Ich weiß nicht, ob ich dich hier richtig verstehe. Wenn du ein Wpf-Projekt frisch anlegst, dann wird in der app.xaml schon ein MainWindow angelegt, das initial auch angezeigt wird. Vermutlich ist bei dir deswegen InitializeShell leer. Das funktioniert aber meines Wissens nur, solange der Konstruktor dieses MainWindows parameterlos ist. Das ist bei mir nicht so, weil der sein zugehöriges ViewModel im Konstruktor erwartet. Deswegen muss vorher der ganze DependencyInjection-Kladderadatsch durchlaufen.

Kannst du bei deinem Projekt mal schauen, wenn du einen Breakpoint vor RequestNavigate setzt, ob in dem Moment bei dir in regionManager.Regions was drinsteht oder ob die Liste leer ist? Ich bin mir nicht sicher, ob das so sein müsste, kommt mir aber schon sinnvoll vor. Bei mir ist das jedenfalls immer leer.

Thema: Prism Navigation: Region liegt in anderem Projekt
Am im Forum: GUI: WPF und XAML

Hallo zusammen,
ich habe ein Problem bei der Navigation mit Prism 7 und habe den starken Verdacht, dass das an meiner Projekt-Struktur liegt. Mein Startup-Projekt enthält die App.xaml.cs. Alle Views befinden sich in einem anderen Projekt auch MainWindowShell. MainWindowShell enthält eine ContentRegion in der Anfangs MainMenuView liegen soll. Über einen Command soll im MainMenuViewModel zum GraphicMenuView navigiert werden. Also statt MainMenuView soll in der Region GraphicMenuView liegen Beim Debuggen habe ich festgestellt, dass der Command auch durchlaufen wird. Das NavigationResult ist false aber ohne Error und auf der Oberfläche passiert gar nichts. Beim Vergleich mit funktionierendem Code ist mir aufgefallen, dass bei mir im regionManager keine Regions sind, obwohl ich in der MainWindowShell eine Region angelegt habe. Bei ausführlichen Tests habe ich festgestellt, dass, wenn ich MainWindowShell in mein Startup-Projekt verschiebe immerhin navigiert wird. Kann es sein, dass ich wegen zwei unterschiedlicher Projekte zwei RegionManager habe und deshalb auch keine Region in dem Startup-Projekt-RegionManager ist? Wenn ja, wie kann ich das beheben. Ich habe auch schon erfolglos versucht die Views aus dem ViewProjekt in einem IModul hinzuzufügen. Es hat mein Problem nicht gelöst. Ich bin langsam ratlos. Das einzige, was mir einfällt, um mein Problem zu lösen, wäre den Inhalt des View-Projekts ins Startup-Projekt zu verschieben. Aber das möchte ich eigentlich nicht nur machen müssen, nur weil ich zu blöd bin es anders zu lösen. Ich bin für alle Hinweise dankbar.


    public partial class App : PrismApplication
    {
        protected override void InitializeShell(Window shell)
        {
            var mainWindow = (MainWindowShell)shell;

            var regionManager = Container.Resolve<IRegionManager>();
            regionManager.RegisterViewWithRegion(RegionNames.Content, typeof(MainMenuView));

            this.MainWindow = mainWindow;
            mainWindow.Show();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<GraphicMenuView>();
            containerRegistry.RegisterForNavigation<MainMenuView>();
        }

        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindowShell>();
        }
    }
MainWindowShell (Auszug):

<ContentControl regions:RegionManager.RegionName="{x:Static utilities:RegionNames.Content}">
MainWindowView (Auszug):

<Button Command="{Binding NavigateCommand}" CommandParameter="Graphic"/>

Thema: .NET Framework und .NET Standard inkompatibel
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Leider habe ich mit Infrastruktur-Themen sehr wenig Erfahrung und verstehe daher gerade nicht wirklich was hier passiert. Wahrscheinlich stelle ich mich an wie der letzte Mensch, aber ich weiß leider einfach nicht mehr weiter.
Im Prinzip möchte ich einfach nur eine Solution-Struktur, in der es ein Hauptprojekt gibt, dass dann auf verschiedene libraries zugreift. In meiner solution liegen (vereinfacht) zwei Projekte:
- Main (winExe) Zielframework: .NET Framework 4.5.2
- ViewModels (library) Zielframework: .NETStandard 1.4
Wenn ich jetzt versuche in Main auf ViewModels zu referenzieren, bekomme ich die Fehlermeldung: "Für das Projekt [...]ViewModels.csproj ist kein mit .NETFramework, Version=v4.5.2 kompatibles Framework vorhanden". Das leuchtet mir noch ein, obwohl ich nicht ganz verstehe wie es entstanden ist. Ich hatte diese Konstellation schon häufiger, um das Zielframework hab ich mich nie gekümmert (hab in alten projekten nachgeschaut, da war es immer .NET Framework 4.x.x). Jedenfalls wollte ich jetzt ganz blauäugig einfach das Zielframework in "ViewModels" anpassen. Da stehen aber nur verschiedene .NET Standard versionen zur Verfügung. Also hab ich versucht mit Gewalt in der csproj von hand <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> einzufügen. Jetzt steht im Projekt-Explorer "Migration erforderlich" und ich kann das Projekt nicht mehr öffnen. Langsam hab ich den Eindruck, ich könnte auf dem falschen Dampfer sein.
Was mache ich falsch?
Was ist der Unterschied zwischen .NET Framework und .NET Standard?
Ist es tatsächlich nicht möglich etwas so elementares wie eine library in allen möglichen Projekten zu verwenden?

Thema: Probleme mit Steuerung von Popup.IsOpen
Am im Forum: GUI: WPF und XAML

Hi,

Ich verzweifle gerade an einem eigentlich gar nicht so kompliziert erscheinenden Problem. Ich möchte beim Klick auf einen Button ein Menü mit etwa vier Punkten ausklappen. Es muss möglich sein diese Punkte irgendwie an eine Liste zu binden, hart codieren hilft mir hier nix. Dann soll man irgendwas in dem Menü auswählen können (der irgendwoander hinklicken) und dann schließt sich das wieder.
Ich arbeite sehr viel mit Styles und da es schon einen ButtonStyle gibt, wäre es wünschenswert, dass ich den für das neue Element nicht kopieren muss, aber natürlich soll der Button mit Extras auf den ersten Blick trotzdem genauso aussehen wie seinen Kollegen :)

Das klang für mich jetzt erstmal sehr ähnlich wie eine nomale MenuBar (bzw. Menu/MenuItem in wpf). Aber das ist alles ein riesiges Geraffel, das brauche ich doch gar nicht. Ich hab ja gar kein dreistufiges Menü mit SubMenu und SubSubMenu, ich will nur ein einziges Menu ausklappen. Außerdem überlagert das MenuItem meinen schon fertig gestylten Button.
Also hab ich versucht das ganze zu verschlanken und nur einfach nur einen Button zu nehmen, der bei Klick (oder MouseOver, da bin ich noch offen) ein Popup öffnet. Das sah zunächst folgendermaßen aus:


    <ControlTemplate x:Key="ButtonWithPopupTemplate" TargetType="Button">
        <Border x:Name="Border">
            <Popup Name="Popup"
                   Placement="Top"
                   IsOpen="{TemplateBinding IsMouseOver}">
                <Border SnapsToDevicePixels="True" BorderThickness="1">
                    <ItemsControl ItemsSource="{Binding Path=MyList}"
                                  ItemTemplate="{DynamicResource MyListItemTemplate}"
                                  Style="{DynamicResource MyListStyle}" />
                </Border>
            </Popup>
        </Border>
    </ControlTemplate>

Da taucht nur das kleine Problem auf, dass das Popup meistens verschwindet, wenn ich mit der Maus drüberfahren will (manchmal wenn ich schnell bin, bleibt es auch stehen). Ich vermute, dass sich entweder IsMouseOver nur auf den Button bezieht und nicht auf das Popup selbst oder dass da ein Spalt dazwischen ist, und wenn ich da drüber bin, hat natürlich weder das Popup noch der button ein MouseOver... Außerdem will ich ja eigentlich dass das Popup bei einem KLICK auf den Button ausfährt.
Also hab ich versucht dem dummen WPF etwas expliziter zu sagen was ich möchte, aber wir scheinen uns irgendwie nicht richtig zu verstehen. Ich habs mit Triggern versucht - die ich zugegeben bisher nur für sehr simple Sachen wie Button disabled hat andere Farbe oder so verwendet hab. Jedenfalls kommt mein trauriger Versuch nichtmal am Compiler vorbei.

    <ControlTemplate x:Key="ButtonWithPopupTemplate" TargetType="Button">
        <Border x:Name="Border">
            <Popup Name="Popup"
                   Placement="Top"
                   IsOpen="{TemplateBinding IsMouseOver}">
                <Border SnapsToDevicePixels="True" BorderThickness="1">
                    <ItemsControl ItemsSource="{Binding Path=MyList}"
                                  ItemTemplate="{DynamicResource MyListItemTemplate}"
                                  Style="{DynamicResource MyListStyle}" />
                </Border>
                <Popup.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="Popup"  Property="IsOpen" Value="false"/>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition SourceName="Popup" Property="IsMouseOver" Value="false"/>
                            <Condition SourceName="Border" Property="IsMouseOver" Value="false"/>
                        </MultiTrigger.Conditions>
                        <Setter TargetName="Popup"  Property="IsOpen" Value="false"/>
                    </MultiTrigger>
                </Popup.Triggers>
            </Popup>
        </Border>
    </ControlTemplate>
Ich bekomme zwei Fehlermeldungen:
- Der statische Member "IsOpenProperty" wurde nicht im Typ "Button" gefunden.
- Mitglieder der Triggers-Sammlung müssen vom Typ "EventTrigger" sein.
Erstens: Was soll das heißen... wurde nicht gefunden. Wieso sucht der auch im Button, ich hab doch gesagt TargetName=Popup? Und EventTrigger hilft mir doch auch nichts, die haben kein Setters-Property, dann kann ich IsOpen ja auch nicht auf true setzen.

Kann mir jemand sagen, was ich hier falsch mache? Oder vielleicht bin ich auch schon viel früher falsch abgebogen, womöglich gibt es eine ganz einfache Lösung für mein Problem.

Thema: ItemsControl-Item Listenelement bei klick auf Element löschen
Am im Forum: GUI: WPF und XAML

Vielen Dankf für die ausführlichen Antworten, hab alle drei Möglichkeiten ausprobiert. Funktioniert alles wunderbar, auch wenn der Proxy sich zuerst ein bisschen geziert hat :) Ich stimme euch zu, der Proxy erscheint mir hier auch ein wenig überdimensioniert, aber trotzdem Danke für den Vorschlag, ich werde ihn auf jeden Fall in meinen Werkzeugkasten aufnehmen - heute sind es vielleicht nur Spatzen, aber wer weiß wann man so ne Kanone mal brauchen kann.

Mir persönlich gefällt die RelativeSource-Lösung an dieser Stelle ganz gut. Ich habs auch nach vielen Spielereien mit der View nicht kaputt bekommen. Wann wäre es denn kein direktes oder indirektes child mehr? Höchstens, wenn ich auf Ebene des ItemsControl einen Button hätte, der einfach das letzte Element löscht oder so. Das wäre aber von der Funktionalität her eine Änderung, die es auch rechtfertigt, dass ich in dem Fall das CommandBinding nochmal anfassen muss.

ps. könnte es sein, dass die Code-Schnipsel für Möglichkeit 2 und 3 vertauscht sind? :)

Thema: ItemsControl-Item Listenelement bei klick auf Element löschen
Am im Forum: GUI: WPF und XAML

Hi,

ich habe ein ItemsControl, und möchte jetzt aus der Source-Liste ein Element löschen. Jetzt hab ich zwei Probleme: Erstens kann ich im ItemsTemplate ja erstmal nur auf das ViewModel des Items zugreifen. Der Löschvorgang muss aber ja eine Ebene drüber stattfinden. Und zweitens bräuchte mein Command ja einen Parameter, damit ich weiß, WELCHES Element gelöscht werden soll.

Also konkret hab ich ein Fenster in dem dann irgendwo das hier steht


<ItemsControl 
    ItemsSource="{Binding Path=ListElements}"
    ItemTemplate="{StaticResource MyTemplate}"/>
Dazu gibts ein ViewModel


public ObservableCollection<ItemViewModel> ListElements;
public ICommand RemoveElement {get; }
Und natürlcih das Template:

<DataTemplate x:Key="MyTemplate" DataType="viewModels:ItemViewModel">
...
    <Button Content="X"
        Command="{Binding RemoveElement }"/>

Das Element soll nicht bei jedem Klick auf das Element gelöscht werden (wär ja auch zu einfach). Nur wenn der Löschbutton geklickt wird.

Mein bisher "bester" Plan war, beim Füllen der Liste ListElements jedem ItemViewModel einen Verweis auf das übergeordnete ViewModele mitzugeben. Dann könnte die Löschfunktion im übergeordneten ViewModel liegen und das ItemViewModel ruft sie dann mit sich selbst als Parameter auf. Aber schön erscheint mir das nicht. Wie macht man sowas vernünftig?

Thema: Wie kann man ein ResourceDictionary testen
Am im Forum: GUI: WPF und XAML

den hatte ich auch schonmal gefunden. Aber mein Problem ist ja keine NullReference. Der Pfad an sich, kann nich so verkehrt sein. Mit dem selben pfad kann ich über einen fileReader die datei lesen:


string filePath = GetFilepath(ESkin.DefaultSkin);
FileStream stream = File.OpenRead(filePath);
XamlXmlReader reader = new XamlXmlReader(stream);

while (reader.Read())
{
     ...
}
Davon abgesehen bin ich bei 10 Jahre alten Antworten immer ein bisschen skeptisch :) Es gibt jedenfalls bei mir kein TestResults directory mehr. Wo die Tests ausgeführt werden würde ich schon rausbekommen, aber ich hab keine Ahnung was mit "add in the .testrunconfig file" gemeint ist.
Falls das noch aktuell ist, kann mir das jemand erklären?

Thema: Wie kann man ein ResourceDictionary testen
Am im Forum: GUI: WPF und XAML

Hallo zusammen,

Ich habe in meiner WPF-Application mehrere ResourceDictionaries für verschiedene Skins. Wenn ein anderer Skin ausgewählt wird, binde ich einfach das entsprechende RessourceDictionary ein. In der GUI sind die entsprechenden Styles alle dynamisch, das funktioniert alles soweit. Aber damit das alles fehlerfrei funktioniert, müssen alle verwendeten Styles auch in allen ResourceDictionaries enthalten sein. Falls irgendwo was fehlt, bekomme ich das nicht direkt mit, ich muss die Anwendung starten und mich überall durchklicken und durch Sichtprüfung feststellen, dass alle Elemente da sind... mittelalterlich!

Daher würde ich das gerne testen. Bisher hab ich da an hundsgewöhnliche Unit-Tests gedacht, auch wenn mir schon klar ist, dass die nicht direkt für den Zweck gemacht sind. Wenn an dem Punkt schon jemand eine bessere, praktikable Lösung hat, nur her damit.

Mein Plan war also, Unit Test -> ResourceDictionary erzeugen -> FindResource("besondersTollerButtonStyle")
Leider bekomme ich es nicht hin mir innerhalb eines Unit-Tests ein ResourceDictionary zu erzeugen, wenn ich dem Dictionary eine Source zuweise, dann knallt es immer.

            
string filePath = GetFilepath(ESkin.DefaultSkin);
Uri uri = new Uri(filePath, UriKind.Absolute);
var rd = (ResourceDictionary) Application.LoadComponent(uri);
Fehler
=> System.ArgumentException: "Absoluter URI kann nicht verwendet werden."
Den URI hab ich an anderer Stelle getestet, mit einem Reader kann ich auf meine ResourceDictionary-Datei zugreifen, das finde ich aber nicht schön, da müsste ich ja stumpf für jeden gesuchten Style die Datei zeilenweise durchlaufen. Sollte das die einzig mögliche Lösung sein, wäre ich enttäuscht.
Obwohl mir nicht klar ist, warum ich LoadComponent nicht mit einem absoluten URI aufrufen können soll, hab ich also mit relativen URIs experimentiert. Erstmal direkt aus meinem bisherigen absoluten (als korrekt angenommenen) URI:


string filePath = GetFilepath(ESkin.DefaultSkin);
Uri uri = new Uri(filePath, UriKind.Absolute);
Uri uriThis = new Uri(Path.GetDirectoryName((Assembly.GetExecutingAssembly().Location)), UriKind.Absolute);
Uri relativeUri = uriThis.MakeRelativeUri(uri);
=> System.NotSupportedException: "Unbekanntes URI-Präfix."
Auch weitere verzweifelte und unbeholfene Versuche haben mich nicht weitergebracht.

Ich weiß nicht mehr weiter, kann mir sagen, wie man sowas sauber machen würde? Oder zumindest die Fehlermeldungen erklären? Oder mir sagen, an welcher Stelle ich mich verrannt habe?

Thema: MVVM Light - Objekte sind zur Laufzeit sichtbar, zur Designzeit nicht
Am im Forum: GUI: WPF und XAML

Update:
Hab letzte Woche endlich auf Visual Studio 2017 umgestellt. Seitdem funktioniert alles tadellos. Problem gelöst.

Thema: MVVM Light - Objekte sind zur Laufzeit sichtbar, zur Designzeit nicht
Am im Forum: GUI: WPF und XAML

kannst du auch nicht, ich war zu blöd zum zählen, sorry

Zitat
Letzter Test, alles bleibt wie es ist, ursprünglicher Code, aber ich erbe von DockPanel, statt von Panel. Überraschung: Ich habe ein Bild im DesignModus, aber es ist die Anordnung, die ich von DockPanel erwarten würde. Zur Erinnerung: ICh überschreibe immernoch ArrangeOverride und MeasureOverride. Zur Laufzeit bekomme ich übrigens auch das richtige Ergebnis (kein DockPanel sondern MySimplePanle).

Also es hat einen Effekt von einem nicht abstrakten Panel zu erben, aber meine überschriebenen Methoden werden einfach ignoriert.

Thema: MVVM Light - Objekte sind zur Laufzeit sichtbar, zur Designzeit nicht
Am im Forum: GUI: WPF und XAML

Von DockPanel erben hab ich schon versucht (siehe zweiter Post, letzer abschnitt).

Meinst du das Template? Das liegt in einem ResourceDictionary, welches ich im Window an anfang einbinde. Den Code hatte ich unterschlagen :) Das ist allerdings das einzige, was ich noch nicht vereinfacht hab.


<Window.Resources>
    <ResourceDictionary x:Name="CurrentResourceDictionary">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/StylingResources/Theme_Simple.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

Das sieht ein bisschen komisch aus, weil ich die StylingRessourcen zur Laufzeit austauschen können will. Ich hab jetzt erstmal Window.Resources... komplett auskommentiert, die Darstellung ist jetzt zusammengeschrumpft auf 123, wenn ich von DockPanel erbe und keine Darstellung wenn ich von Panel erbe. Das scheint also auch nicht das Problem zu sein.

Thema: MVVM Light - Objekte sind zur Laufzeit sichtbar, zur Designzeit nicht
Am im Forum: GUI: WPF und XAML

Hat leider auch nicht funktioniert. Ich hab jetzt den bisherigen DataContext ausdkommentiert und nur das mti der DesingInstance drin, aber das Ergebnis bleibt unverändert. Schade, die Idee klang vielversprechend.

Thema: MVVM Light - Objekte sind zur Laufzeit sichtbar, zur Designzeit nicht
Am im Forum: GUI: WPF und XAML

Nein, das macht keinen Unterschied. Im DesignModus scheint die Tatsache, dass ich diese Methode überschreibe einfach vollständig ignoriert zu werden.

Aber bei einem Test zu deiner Frage ist mir nochwas aufgefallen. Ich glaube mein eigenes Panel ist völlig unschuldig. Wenn ich für das ItemsControl statt meines eigenen Panels ein DockPanel verwende, dann sehe ich zwar zur DesignZeit was, aber auch nicht das gleiche wie live. Die Liste, die ich im ViewModel erstelle (siehe erster post), ist mit Werten gefüllt, die nicht von mir kommen. Statt "schokokeks" und so, heißen sie nur "1", "2" und "3".
Mein Problem hat sich also auf die Frage reduziert, warum obwohl ich für den DesignModus die gleiche Liste erzeuge wie zur Laufzeit (siehe unten), diese Liste offenbar mit vollkommen anderen Werten gefüllt wird. Aber gefüllt wird sie, sie ist ja offenbar nicht leer. Aber wo zum Teufel kommen "1", "2" und "3" her?

Zugehöriges ViewModel:

C#-Code:

 public class TestWindowViewModel : ViewModelBase
{
    public ObservableCollection<String> MyList{ get; set; }

    public TestWindowViewModel()
    {
       if (IsInDesignMode)
       {
            this.MyList= new ObservableCollection<String>();
            this.MyList.Add("schokoKeks");
            this.MyList.Add("halloEcho");
            this.MyList.Add("Wololooo");
            this.MyList.Add("DumDidldum");
        }
        else
        {
            this.MyList= new ObservableCollection<String>();
            this.MyList.Add("schokoKeks");
            this.MyList.Add("halloEcho");
            this.MyList.Add("Wololooo");
            this.MyList.Add("DumDidldum");
        }
    }
}

Thema: MVVM Light - Objekte sind zur Laufzeit sichtbar, zur Designzeit nicht
Am im Forum: GUI: WPF und XAML

@MrSparkle:
Das Problem taucht auf, wenn ich mein eigenes Panel <userControls:MySimplePanel> anstatt <Panel> verwende. Die beiden Methoden aus meinem letzten Beitrag ändern daran nichts. Sie waren nur ein Versuch auszuschließen, dass das Problem in diesen Methoden liegt. Das Problem besteht aber weiterhin sowohl mit den ausführlicheren Methoden aus meinem ersten Post als auch mit den extrem verkürzten Methoden.

@p!lle:
Mit einem normalen Panel (DockPanel oder Grid, Panel geht natülich nicht, weils abstrakt ist, mehr hab ich jetzt mal nicht getestet) funktioniert alles wunderbar.
Wenn ich die MeasureOverride und ArrangeOverride auskommentiere bleibt der Fehler bestehen. In MySimplePanel steht jetzt überhaupt kein Code mehr und ich hab außerdem noch getestet, ob es vielleicht funktioniert, wenn ich statt von Panel von DockPanel erbe, weil das abstrakte Panel alleine nicht geht. Hab aber in keinem Fall eine Vorschau im DesignModus bekommen.

Letzter Test, alles bleibt wie es ist, ursprünglicher Code, aber ich erbe von DockPanel, statt von Panel. Überraschung: Ich habe ein Bild im DesignModus, aber es ist die Anordnung, die ich von DockPanel erwarten würde. Zur Erinnerung: ICh überschreibe immernoch ArrangeOverride und MeasureOverride. Zur Laufzeit bekomme ich übrigens auch das richtige Ergebnis (kein DockPanel sondern MySimplePanle). Ich bin verwirrt und müde, aber das könnte eine Spur sein. :)

Thema: MVVM Light - Objekte sind zur Laufzeit sichtbar, zur Designzeit nicht
Am im Forum: GUI: WPF und XAML

Update:
Ich habe inzwischen auch mein Panel bis zur Sinnlosigkeit zusammengeschrumpft. Ich weiß nicht, woran sich der DesignMode hier noch stoßen könnte.


        protected override Size MeasureOverride(Size availableSize)
        {
            Size desiredSize = new Size(100, 100);

            return desiredSize;
        }

        protected override Size ArrangeOverride(Size finalSize)
        {
            foreach (FrameworkElement child in this.InternalChildren)
            {
                Rect rect = new Rect(new Point(0,0), new Size(100,100));
                child.Arrange(rect);
            }

            return finalSize;
        }

Das Problem besteht leider nur zur DesignZeit. Deswegen hilft mir hier auch der Debugger nichts - nichtmal irgendwelche Konsolenausgaben. Ich wüsste jedenfalls nicht wie. Wenn du irgendeine Möglichkeit weißt, wie man das debuggen kann, nur her damit.

Eigentlich sollte mir MVVM Light helfen meine ObservableCollection auch schon zur DesignZeit mit Objekten zu füllen, die mein ItemsControl dann darstellen kann. Weil es eben in vielen Fällen - zum Beispiel bei einem eigenen Panel - ziemlich umständlich ist, für das optische Ergebnis immer erst das Programm starten zu müssen. Genau dieses MVVM Light feature funktioniert bei mir nicht. Ob das Problem bei MVVM Light liegt oder allgemein beim DesignModus, weiß ich nicht. Vielleicht / möglicherweise / wahrscheinlich liegt das an meinem Panel, ich weiß aber nicht, was genau ich in diesem Panel tue, was im DesignModus nicht geht. Deswegen frage ich, weil ich einfach keine Plan mehr habe, wie ich diesem Problem auf den Grund gehen kann.

Anmerkung:
Möglicherweise hat das zu Missverständnissen geführt. Wenn ich DesingZeit sage, meine ich DesingMode / Entwurfszeit / NICHT-Laufzeit eben. :)

Thema: MVVM Light - Objekte sind zur Laufzeit sichtbar, zur Designzeit nicht
Am im Forum: GUI: WPF und XAML

Kennt sich irgendjemand mit MVVM Light aus? Ich komme hier wirklich nicht mehr weiter. Ich möchte OberflächenObjekte in meinem eigenen Panel anordnen, das alles funktioniert zur Laufzeit auch wunderbar, aber zur DesignZeit ist mein Fenster leer. Ich habe mein Problem jetzt schon aufs Einfachste zusammengeschrumpft, es scheint ein Problem mit meinem eigenen Panel zu geben, sicher bin ich mir aber nicht.
Kann mir jemand sagen, was ich falsch mache und warum es zur Laufzeit dann doch funktioniert?

Ausschnitt aus Window


    <Window.DataContext>
        <Binding Path="TestWindowVm" Source="{StaticResource Locator}"/>
    </Window.DataContext>
    
    <Grid>
        <ItemsControl ItemsSource="{Binding Path=MyList}"
                      ItemTemplate="{DynamicResource TestTemplate}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <userControls:MySimplePanel />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </Grid>

Wenn ich hier statt userControls:MySimplePanel zum Beispiel DockPanel einsetzte, sehe ich auch zur DesignZeit was.

Und hier kommt der Hauptverdächtige, MySimplePanel:


    public class MySimplePanel: Panel
    {
        private const double OVERLAP = 0.5;

        protected override Size MeasureOverride(Size availableSize)
        {
            Size desiredSize = new Size(0, 0);
            double überlappungsfaktor = 1; // erstes Element volle Breite

            foreach (FrameworkElement child in this.InternalChildren)
            {
                child.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));

                desiredSize.Width += child.DesiredSize.Width * überlappungsfaktor;
                überlappungsfaktor = OVERLAP;

                if (desiredSize.Height < child.DesiredSize.Height)
                {
                    desiredSize.Height = child.DesiredSize.Height;
                }
            }

            return desiredSize;
        }

        protected override Size ArrangeOverride(Size finalSize)
        {
            Point childPos = new Point(0, 0);

            foreach (FrameworkElement child in this.InternalChildren)
            {
                child.Arrange(new Rect(childPos, child.DesiredSize));

                childPos.X += child.DesiredSize.Width * OVERLAP;
            }

            return finalSize;
        }
    }

Zugehöriges ViewModel:


    public class TestWindowViewModel : ViewModelBase
    {
        public ObservableCollection<String> MyList{ get; set; }

        public TestWindowViewModel()
        {
            if (IsInDesignMode)
            {
                this.MyList= new ObservableCollection<String>();
                this.MyList.Add("schokoKeks");
                this.MyList.Add("halloEcho");
                this.MyList.Add("Wololooo");
                this.MyList.Add("DumDidldum");
            }
            else
            {
                this.MyList= new ObservableCollection<String>();
                this.MyList.Add("schokoKeks");
                this.MyList.Add("halloEcho");
                this.MyList.Add("Wololooo");
                this.MyList.Add("DumDidldum");
            }
        }
    }

Ressourcen:

    <DataTemplate x:Key="TestTemplate" DataType="sys:String">
        <Grid>
            <Rectangle Width="150" Height="350" Fill="GreenYellow" Stroke="Black"/>
            <TextBlock Text="{Binding}" 
                      VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,0,0,0" 
                      TextWrapping="Wrap"/>
        </Grid>
    </DataTemplate>

Thema: Mehrere Slider: Summe der Werte soll gleich bleiben
Am im Forum: GUI: WPF und XAML

@Sir Rufo: du hast Recht, so rum ist es Unsinn. Wenn der Ausgleichsslider auf 0 ist, kann er nach unten nix mehr ausgleichen. Ich hab das ohne nachzudenken auch für den oberen Grenzwert behauptet.

@Palladin007:
Die Lösung gefällt mir echt gut. Ich werde das mal ausprobieren. Ist aber vermutlich schon eine Herrausforderung dem User das Prinzip optisch ganz klar zu vermitteln.

@FZelle:
Ich bin zwar kein Experte für MVVM, aber ganz so blöd, dass ich direkt an irgendwelche Daten binde, bin ich auch wieder nicht :). Ich wollte das Problem hier nur vereinfacht darstellen, da fand ich es nicht so wichtig, wo genau das alles passiert. Aber wenn es dich beruhigt: Das alles passiert schon im entsprechenden ViewModel und über Properties, die auf das Dictionary zugreifen. Das Dictionary hab ich nur deswegen auch im ViewModel, weil ich die Daten dauernd durchlaufen muss (und weil ich während so einer Rumprobier-Phase eben manchmal etwas Unordnung im Code hab). Allerdings hab ich ehrlich gesagt auch schon drüber nachgedacht, dass die Beschränkung auf 20 (in meinem Fall wenigstens) eigentlich eine Einschränkung der Logik ist. Und dann gehört es ja eigentlich in die Logik und nicht ins ViewModel. Andererseits der Ausgleich fällt dann doch wieder in den AufgabenBereich der GUI. Das sind aber alles Gedanken, mit denen ich klar komme und mit denen ich dich nicht belästigen würde, wenn du mir nicht unterstellt hättest, ich würde sie mir nicht machen.

Thema: Mehrere Slider: Summe der Werte soll gleich bleiben
Am im Forum: GUI: WPF und XAML

Mist, an dem Einwand ist leider was dran. Und wenn ich so überlege kann ich mich tatsächlich auch erinnern, dass mich das schon bei anderen Anwendungen aufgeregt hat, dass ich einen slider so einstelle wie ich ihn haben will und wenn ich beim nächsten weitermache, wird an meinem ersten (schon richtig eingestellten) Wert wieder rumkorrigiert. Da ich hauptsächlich mein eigener User bin, habe ich ein verstärktes Interesse daran, dass meine GUI den User nicht nervt. Schade eigentlich, es war so ein schönes Problem :) Für micht hat sich das Problem damit erledigt.

Es könnte aber für geringfügig andere Problemstellungen weiterhin interessant sein. Wenn ich jetzt keine int-Werte im Slider hätte, sondern double. Erstens kann ich es dem User dann nicht mehr zumuten, das bis auf die zwölfte Nachkommastelle selber auszugleichen. Zweitens wären dann wahrscheinlich die selbstkorrigierenden Slider nicht so schlimm, weil der User sowieso nicht exakt 2,37295034 da stehen haben will und nichts anderes. Aber, WANN würde ich diese Korrektur durchführen? Bei jeder noch so kleinen Kommastelle? Bekomme ich das überhaupt mit? Wann sagt mir die Oberfläche denn Bescheid, so oft sie es schafft oder gibt es da einen Genauigkeit, beispielsweise bei jedem Tausendstel Veränderung wird Bescheid gesagt?

Thema: Mehrere Slider: Summe der Werte soll gleich bleiben
Am im Forum: GUI: WPF und XAML

Hallo,
mein Problem ist eigentlich ganz einfach, ich habe im Prinzip einfach nur 5 Slider, die Werte zwischen 0 und 20 annehmen können. Im Hintergrund sind die verschiedenen Sliderwerte an die Werte eines Dictionaries gebindet beispielsweise Slider A ist gebunden an meinTollesDictionary[A].
Jetzt möchte ich, dass die Summe aller Werte immer gleich 20 ist. Ich wurschtle mich von einer Lösung zur nächsten, aber so richtig zufriedenstellend ist keine. Und dabei ist das ja bestimmt kein außergewöhnliches Problem. Aber mit googeln bin ich bisher auch nicht weitergekommen.

Um das ganze erstmal zum laufen zu bringen, hab ich den letzten Slider disabled und den Wert davon quasi als Ausgleich verwendet, immer wenn man an einem anderen Slider war rumstellt, gleicht der letzte das aus. Das hat mir fürs Erste gereicht, aber das Problem liegt natürlich auf der Hand, das klappt für kleine Veränderungen, aber nicht für Extremwerte, wenn mein AusgleichsSlider schon auf 20 ist kann er nach oben nix mehr ausgleichen.
Jetzt hab ich angefangen für diese Fälle das Dictionary nach und nach zu durchlaufen und die anderen werte auch als Ausgleichswerte zu verwenden. Die Lösung funktioniert, ist aber eine riesige Sauerei, weil alles voller Ausgeleichsrechnungen und Ausnahmen. Ich glaube ich hab mich total verrannt.

Hat jemand sowas schonmal gemacht oder sonst irgend einen Ansatz, wie man das sauber umsetzten könnte? Bringt wpf sowas womöglich schon mit? So wie eine Gruppe RadioButtons ja auch voneinander abhängt könnte es sowas ja auch für slider geben. Wenn nicht, würde es vielleicht Sinn machen von dieser Seite ranzugehen und mir ein eigenes SliderGroupElement zu bauen?

Thema: In einer generischen Klasse statische Methode der Basisklasse aufrufen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Danke für die Antworten, ihr habt natürlich Recht, ich hab mich vollkommen verhaspelt. Jetzt wo ich mir das so anschaue, war das ganz schön blöd. Manchmal ist man so total fixiert darauf, den Nagel mit dem Schraubenzieher in die Wand zu hauen, dass man sich nur ärgert warum der blöde Schraubenzieher nicht richtig funktioniert.

Thema: In einer generischen Klasse statische Methode der Basisklasse aufrufen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

ich versuche in einer generischen Klasse (TolleGenerischeKlasse<T> where T : Basisklasse) eine statische Methode der Basisklasse aufzurufen. Mein naiver Versuch T.StatischeMethode() hat nicht funktioniert. Mache ich was falsch oder geht das gar nicht? Die Autovervollständigung bietet mir nichtmal new an, nur typeof.

Vereinfachte Codeschnipsel


public class Basisklasse
{
    ...
    
    public static int StatischeMethode(){...}

}

public class TolleGenerischeKlasse<T> where T : Basisklasse
{
    ...

    public TolleGenerischeKlasse (params T[] args)
    {
        T.StatischeMethode(); // geht nicht
        ...
    }
}

Thema: Panel mit ItemControl-Eigenschaften
Am im Forum: GUI: WPF und XAML

Nachdem ich jetzt die halbe Nacht ungeduldig dran rumgefummelt hab, funktioniert es jetzt endlich. Es lag tatsächlich an dem ContentPresenter dazwischen. Dessen Eigenschaften ließen sich über ItemsControl.ItemContainerStyle setzen.

Alles noch nicht sauber, aber das Folgenden funktioniert jedenfalls.


    <ItemsControl ItemsSource="{Binding Path=DataListTEST}"
                  ItemContainerStyle="{StaticResource TESTContainerStyle}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Style="{DynamicResource HexagonStyle}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate> 
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <local:HexagonGrid />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

Und irgendwo anders:

    <Style x:Key="TESTContainerStyle" TargetType="ContentPresenter">
        <Setter Property="userControls:HexagonGrid.Row" Value="{Binding Position.Y}"/>
        <Setter Property="userControls:HexagonGrid.Column" Value="{Binding Position.X}"/>
    </Style>

Thema: Panel mit ItemControl-Eigenschaften
Am im Forum: GUI: WPF und XAML

bin endlich dazu gekommen das auszuprobieren, aber ich hab noch ein Problem. Und zwar schaffe ich es nicht in meinen Items die Attached Properties des HexagonGrid zu setzen.
Dieses Property legt die (logische) Position innerhalb des Gitters fest. Die darzustellenden Elemente kennen ihre Position und die soll sinnigerweise an dieses attached Property gebunden werden. Leider wird die Position offensichtlich nicht gesetzt.
Im LiveVisualTree sehe ich, dass da noch ein ContentPresenter zwischen HexagonGrid und meinem eigentlichen DatenElement ist (siehe Anhang), wahrscheinlich sollte ich die attached properties im ContentPresenter setzen, aber erstens weiß ich nicht wie ich da rankomme und zweitens weiß ich nicht, ob ich auf der Ebene des contentPresenters schon auf das DatenObjekt zugreifen kann?

Hier mal der xamlCode:


    <ItemsControl ItemsSource="{Binding Path=DataListTEST}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Style="{DynamicResource HexagonStyle}"
				            local:HexagonGrid.Row="{Binding Position.Y}" 
                            local:HexagonGrid.Column="{Binding Position.X}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>

        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <local:HexagonGrid />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

Thema: Panel mit ItemControl-Eigenschaften
Am im Forum: GUI: WPF und XAML

Es sieht so aus, als würde das all meine Probleme lösen. Danke!
Langsam fange ich an WPF zu mögen :)

Thema: Panel mit ItemControl-Eigenschaften
Am im Forum: GUI: WPF und XAML

Ich habe eine Liste mit Objekten, und würde diese gerne alle innerhalb eines Panels darstellen. Gibt es eine Möglichkeit das so elegant zu lösen, wie zum Beispiel bei ComboBoxen mit einem Binding an ItemsSource?
Mein Panel ordnet die Objekte in einem Hexagon-Gitter an, es würde also durchaus Sinn machen, wenn es auch über die Darstellung dieser Objekte (sechseckig) entscheiden würde.
Auch das würde ich mit einem ItemControl hinbekommen. Lässt sich das irgendwie auch mit einem Panel umsetzen. Oder gibt es andersrum irgendein ItemControl-Panel-Hybrid-Dings, was beides kann, oder sieht jemand eine Möglichkeit, wie ich mir sowas bauen kann?

Thema: ResourceDictionary an Property binden - geht das?
Am im Forum: GUI: WPF und XAML

Ich habe im ganzen Umkreis nix statisches, weder Konstruktoren noch Properties. Was genau meinst du damit?

Die Ressource ist auch da, was aber Wurscht sein dürfte, da mein BreakPoint im Converter gar nicht durchlaufen wird.

Mit dem Converter in App.xaml hat sich überhauptnichts geändert. (Nachtrag: Ich bekomme hier auch die andere ZusatzInfo (siehe unten))

Also ich hab testweise das MergedDictionary in die nächst tiefere Ebene, ins Grid, verlagert. (Was ein bisschen blöd ist, weil ich jetzt mein Fenster nicht mehr stylen kann.) Jedenfalls muss ja jetzt der Converter auf jeden Fall schon da sein.
Jetzt sehe ich zumindest zur Design-Zeit ein Fenster, statt der Fehlermeldung "Value cannot be null". Das könnte aber natürlich auch dran liegen, dass mein Window-Style jetzt auf keine kaputte Ressource mehr zugreift, sondern auf gar keine.
Leider bekomme ich noch immer zur Laufzeit eine Exception, allerdings mit einer anderen Zusatzinformation:
Additional information: "Binding" kann nicht für die Eigenschaft "Source" vom Typ "ResourceDictionary" festgelegt werden. "Binding" kann nur für eine "DependencyProperty" eines "DependencyObject" festgelegt werden.
Leider ist für mich diese ZusatzInfo noch kryptischer als die letzte. Heißt das, dass ich an der Stelle gar nichts dran binden kann? "CurrentTheme" macht brav den ganzen INotifiePropertieChanged-Kram. Oder muss ich das hier als DependencyProperty anlegen? Sorry, die Fehlermeldung hinterlässt mich verwirrter als vorher.

Noch ein paar verzweifelte Tests:
- Wenn ich das Binding lösche und stattdessen nur Source="" schreibe, ändert sich gar nichts (Inner Exception: Value cannot be null)
- Wenn ich das Binding lösche und stattdessen nur Source="aaa" schreibe, gibt es keine InnerException mehr

Thema: ResourceDictionary an Property binden - geht das?
Am im Forum: GUI: WPF und XAML

Immer wenn ich denke ich hätte eine gute Idee, hat Visual Studio irgendwas dagegen.
In diesem Fall dachte ich, es wäre eine gute Idee, meine StylingResourcen sauber zu binden, anstatt bei jeder Änderung im Code behind rumwurschteln zu müssen.


<Window.Resources>
    <ResourceDictionary x:Name="CurrentResourceDictionary" >
        <converter:ThemeToResourceFileConverter x:Key="ThemeConverter"/>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="{Binding Path=CurrentTheme, 
                                                                      Converter={StaticResource ThemeConverter}}"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

Den Converter dazu poste ich nicht, weil er gar nicht durchlaufen wird bevor der Fehler auftaucht.

Obwohl folgender Fehler im xaml erkannt wird kompiliert alles und das Programm startet.
"Value cannot be null. Parameter name: item"

Dann bekomme ich eine Exception:
XamlParseException occured
Exception thrown: 'System.Windows.Markup.XamlParseException' in PresentationFramework.dll
Additional information: Zeilennummer "15" und Zeilenposition "37" von "Die Angabe eines Werts für "System.Windows.StaticResourceExtension" führte zu einer Ausnahme.".

Ich hab nach beiden Fehlermeldungen schon gegoogelt, allerdings mit mäßigem Erfolg. Keiner mit der selben Meldung hat da drin irgendwas gebindet. Aber wenn ich die Source ohne Binding einfach fest zuweise, funktioniert alles.

Daher meine Frage: Geht das was ich vorhabe überhaupt, wenn ja, geht es so wie ich mir das vorstelle? Wenn nein, gibt es eine andere saubere Lösung?

Thema: Eigenes Window in WPF bauen - Standardrahmen vermeiden
Am im Forum: GUI: WPF und XAML

Huch, Antwort jetzt erst gesehen, danke, ich werd mir das mal anschauen.