2016-05-16 4 views
0

In meinem Code habe ich eine UIElement-Variable, die ich mit bestimmten Tasten drücken. Jetzt habe ich diese Variable:Bindung an UIElement in Code-Behind Absturz

public UIElement currentMenu; 

Sets auf diesen Wert:

currentMenu = (UIElement)Resources["Home"]; 

ich es von den Ressourcen so nicht ich habe messily-behind-Code in der Verwaltung, I Die Ressourcen werden in ein separates ResourceDictionary exportiert, sobald dieses Problem gelöst ist.

Mein Splitview sieht wie folgt aus:

<SplitView x:Name="NavPane" OpenPaneLength="250" CompactPaneLength="50" Content="{x:Bind currentMenu}" DisplayMode="CompactOverlay" IsPaneOpen="False" PaneClosing="NavPane_PaneClosing"> 

Die prblem kommt in an dieser Stelle, stürzt die Bindung die gesamte Anwendung mit einer unhndled win32 Ausnahme. Ich bekomme keine Beschreibung und der Fehlercode ändert sich jedes Mal. Ich habe mit Breakpoints überprüft, ob dieses Verhalten tatsächlich durch die Bindung verursacht wird, und das ist es auch.

Wenn Sie irgendwelche Vorschläge haben, was hier schief gehen könnte, schreiben Sie bitte eine Antwort. Ich werde jede zusätzliche benötigte Information liefern (wenn vernünftig, ich werde dir nicht meine gesamten Projektdateien schicken)

Jede Hilfe wird geschätzt!

Antwort

0

Ich habe die Antwort auf meine Frage gefunden!

Nämlich, das war nicht der Weg, es zu tun. Stattdessen habe ich einen Rahmen innerhalb der Inhalt der Splitview erklärt:

<SplitView.Content> 
    <Frame x:Name="activeMenu"/> 
</SplitView.Content> 

Dann benutze ich die Frame.Navigate() Funktion auf meine Menüs in den Rahmen zu laden:

public MainPage() 
    { 
     DataContext = this; 
     this.InitializeComponent(); 
     SetMenu(0); 
    } 

    private void SetMenu(int key) 
    { 
     switch (key) 
     { 
      case 0: 
       activeMenu.Navigate(typeof(HomeMenu)); 
       break; 
      //You can add in as many cases as you need 
     } 
    } 

Was Sie dann brauchen Legen Sie alle gewünschten Menüs als separate Seiten in Ihren Projektdateien fest. In diesem Beispiel enthält HomeMenu.xaml das Raster für das Menü, das Benutzer beim Starten der App sehen.

Dies löste das Problem, aber danke an alle (StepUp), die zur ursprünglichen (leider erfolglosen) Lösung beigetragen haben!

+0

http://meta.stackexchange.com/questions/126180/is-it-acceptable-to-write-a-thank-you-in-a-comment – StepUp

0

Ihr Problem, dass Sie eine Variable verwenden, keine Eigenschaft.

private UIElement currentMenu; 
public string CurrentMenu 
{ 
    get { return currentMenu; } 
    set { 
     currentMenu=value); 
     OnPropertyChanged("CurrentMenu"); 
     } 
} 

die Grundregeln So Kontrolle zu binden, zu einem "varaible":

  • Variable sollte eine Eigenschaft, kein Feld sein.
  • sollte es public sein.
  • entweder eine anmelde Eigenschaft (geeignet für Modellklassen) oder eine Abhängigkeitseigenschaft (geeignet für Ansichtsklassen)

UI zu unterrichten, falls Sie implementieren INotifyPropertyChanged:

public event PropertyChangedEventHandler PropertyChanged; 
public void OnPropertyChanged(string propertyName) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

Update:

Ihr Bidning sollte so aussehen:

<SplitView x:Name="NavPane" OpenPaneLength="250" CompactPaneLength="50" 
     Content="{Binding CurrentMenu}" DisplayMode="CompactOverlay" IsPaneOpen="False" 
     PaneClosing="NavPane_PaneClosing"> 
+0

Ich habe jetzt diese Implementierung: 'private UIElement currentMenu; öffentliche Zeichenkette CurrentMenu { get {return currentMenu.ToString(); } set { currentMenu = (UIElement) Ressourcen [Wert]; OnPropertyChanged ("CurrentMenu"); } } öffentliche Ereignis PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged (Zeichenfolgeneigenschaftsname) { PropertyChanged? .Invoke (dies, neues PropertyChangedEventArgs (propertyName)); } 'Gibt immer noch ähnliche Fehler zurück –

+0

@LightDrake könnten Sie posten, was internerreception sagt und volle Stapelausnahme verfolgen. – StepUp

+0

@LightDrake ist es UWP? – StepUp