none
UserControls und WPF? RRS feed

  • Frage

  • Hey, vll kennt mich ja schon der Ein oder Andere aus meiner letzten Frage.

    Die hier geht zwar in die selbe Richtung, hab mich aber nun auf Grund eines Ratschlags schon etwas in C# eingearbeitet.

     

    Nun zu meiner Frage:

    Ich möchte meine Applikation in mehrere 'Seiten' unterteilen und hab das unter Visual C++/CLI schon mit UserControls versucht. Nun bin ich auf C# und WPF umgestiegen und wollte nun mal fragen, ob es auch in WPF UserControls gibt?

    Meine zweite Frage wäre dann, wie man dann das 'Wechseln der Seiten' am besten realisieren würde? Ich hätte mir vorgestellt aus den einzelnen UserControls heraus eine Methode im Hauptfenster (das sie enthält) aufzurufen, die dann das nächste UserControl öffnet? Speziell lag mein Problem darin, dass ich nicht wusste, wie ich das Hauptfenster ermittle, bzw eine Referenz darauf bekomme um die Methode aufzurufen?

     

    Hoffe ihr könnt mir nochmals helfen.

    Niklas U.

    Freitag, 10. September 2010 12:44

Antworten

  • Hallo Niklas,

    zunächst Glückwunsch zum Umstieg, WPF mit C# ist eine gute Entscheidung. Gerade auch für UI-Dinge.
    Die richtige Gruppe für WPF ist aber eher das Forum [WPF], aber ich habe hier ja zufällig auch mal hereingeschaut.




        > 1) ob es auch in WPF UserControls gibt?

    ja natürlich.

    [UserControl-Klasse (System.Windows.Controls)]
    http://msdn.microsoft.com/de-de/library/system.windows.controls.usercontrol.aspx

    [Exemplarische Vorgehensweise: Hosten eines zusammengesetzten WPF-Steuerelements in Windows Forms]
    http://msdn.microsoft.com/de-de/library/ms745781.aspx

    [WPF: Anpassen von Steuerelementen für Windows Presentation Foundation]
    http://msdn.microsoft.com/de-de/magazine/cc163421.aspx

    [Video Training - WindowsClient.net]
    http://windowsclient.net/learn/video.aspx?v=76360




         >  wie man dann das 'Wechseln der Seiten' am besten realisieren würde?

    Tatsächlich ist heutzutage dafür sicher [Prism (Composite Client Application Guidance)] state of the art, um dieses Problem sehr sauber anzugehen. Dennoch würde ich Dir empfehlen - wo Du ja erst anfängst - erstmal ganz normale UserControl's zu bnutzen, da Du so auch erstmal schneller ans Ziel kommst. Ich sehe bei reinen Seitenwechseln keinen Wizard-Ansatz als vorteilhaft. Also eine Art Masterpage willst Du ja schon haben. Das ist dann vielleicht im ersten Step für Dich einfach die MainWindow.xaml, in der Du zum Beispiel ein ContentControl/ItemsControl/StackPanel hast, in die die Instanzen der anderen Seiten dann zum gewünschten Zeitpunkt gesetzt werden.
    Die Seiten kann man einfach als einzelne XAML Views (oh ja, später dann mal MVVM andenken ;-) umsetzen. Zur Laufzeit setzt man einfach die Content-Eigenschaft der ContentControls (oder entsprechend) auf die neu instanziierte View. Hier vielleicht auch Ansätze:
         [Magellan Shared Layouts - Master Pages for WPF]   /  [WPF MasterPage - CodeProject]  /  [WPF Master Pages - CodeProject]
    Wenn Du einen Browser-artikge Seiten-Anwahl nutzen möchtest, könnte ggf. die Nutzung des NavigationService über den Navigation-Namespace in WPF vorteilhaft sein, wenn das eher ein TreeView-Neuanwahl links ist, nicht so sehr, aber auch möglich. Dass natürlich auch viele [WPF-Grundlagen] gleichzeitig mit der Erstellung Deiner UserControl-Lösung erworben werden müssen/sollten, liegt natürlich in der Natur der Sache.

     


    ciao Frank
    Freitag, 10. September 2010 17:53
  • Hallo Niklas,

    das geht trotzdem auch in WPF oft gut mit:

    [NavigationCommands-Member (System.Windows.Input)]
    http://msdn.microsoft.com/de-de/library/system.windows.input.navigationcommands_members.aspx

    Also die Semantik eines "explitziten Page-Wechsels" zum Beispiel mit folgendem Command (es könnte auch ein eigenes sein) :

    [NavigationCommands.GoToPage-Eigenschaft (System.Windows.Input)]
    http://msdn.microsoft.com/de-de/library/system.windows.input.navigationcommands.gotopage.aspx

    Das UserControl schickt dann einfach das Kommando ab (ggf. ohne Wissen darüber, wer das dann letztlich handelt - oder als Variante an ein höher gegelegenes CommandTarget) und man kann dann ggf. auch den Handler für CanExecute und Execute (oder CanExecuteChanged) implementieren. Im nächsten Posting ist ein einfaches Beispiel dafür:


    ciao Frank

    Mittwoch, 22. September 2010 10:59
  • Ich möchte meine Applikation in mehrere 'Seiten' unterteilen und hab das unter Visual C++/CLI schon mit UserControls versucht. Nun bin ich auf C# und WPF umgestiegen und wollte nun mal fragen, ob es auch in WPF UserControls gibt?

    Meine zweite Frage wäre dann, wie man dann das 'Wechseln der Seiten' am besten realisieren würde? Ich hätte mir vorgestellt aus den einzelnen UserControls heraus eine Methode im Hauptfenster (das sie enthält) aufzurufen, die dann das nächste UserControl öffnet? Speziell lag mein Problem darin, dass ich nicht wusste, wie ich das Hauptfenster ermittle, bzw eine Referenz darauf bekomme um die Methode aufzurufen?

    Hallo Niklas

    im Thread zuvor wurde dir offenbar ein 'Wizard' genannt, hier wäre eine WPF-Variante

    http://www.codeproject.com/KB/WPF/InternationalizedWizard.aspx


    Frage daher:
    entspricht dein 'Wechseln der Seiten' von der Art her einem Wizard (mit [vor-]bestimmter Reihenfolge der Seiten), oder sollte die Reihenfolge bei dir völlig frei sein?

    Dann wäre evtl. mit WPF ähnlich dem 'Browser' Stil:
    Übersicht über die Navigation
    http://msdn.microsoft.com/de-de/library/ms750478.aspx
    Freitag, 10. September 2010 12:58
  • als einfaches Beispiel also:

    Timer.xaml (das UserControl):

    <UserControl x:Class="UserControlDemo.Timer"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Height="30" Width="160">
     <StackPanel Orientation="Horizontal" >
     <TextBlock Margin="2,2,2,2" Name="_ElapsedTime" MinWidth="30"></TextBlock>
     <Button 
     Command="GoToPage" CommandParameter="Meine neue Seite" 
     Click="StartTimer">Start Timer</Button>
     <Button Click="StopTimer">Stop Timer</Button>
     </StackPanel>
    </UserControl>
    


    ______________

    Window1.xaml.cs:

     public partial class Window1 : Window
     {
     public Window1()
     {
     InitializeComponent();
     grid.Children.Clear(); 
     grid.Children.Add(new Timer());
     }
    
     private void OnGoToPage(object sender, ExecutedRoutedEventArgs e)
     {
     MessageBox.Show("Kommando GoToPage erhalten ... \n" +
     "mit Parameter: \"" + e.Parameter + "\", \n" +
     "von Element-Typ: \"" + e.Source.GetType().FullName + "\"");
    // hier dann UserControl ggf. wechseln ... } }

    ciao Frank
    Mittwoch, 22. September 2010 11:19

Alle Antworten

  • Ich möchte meine Applikation in mehrere 'Seiten' unterteilen und hab das unter Visual C++/CLI schon mit UserControls versucht. Nun bin ich auf C# und WPF umgestiegen und wollte nun mal fragen, ob es auch in WPF UserControls gibt?

    Meine zweite Frage wäre dann, wie man dann das 'Wechseln der Seiten' am besten realisieren würde? Ich hätte mir vorgestellt aus den einzelnen UserControls heraus eine Methode im Hauptfenster (das sie enthält) aufzurufen, die dann das nächste UserControl öffnet? Speziell lag mein Problem darin, dass ich nicht wusste, wie ich das Hauptfenster ermittle, bzw eine Referenz darauf bekomme um die Methode aufzurufen?

    Hallo Niklas

    im Thread zuvor wurde dir offenbar ein 'Wizard' genannt, hier wäre eine WPF-Variante

    http://www.codeproject.com/KB/WPF/InternationalizedWizard.aspx


    Frage daher:
    entspricht dein 'Wechseln der Seiten' von der Art her einem Wizard (mit [vor-]bestimmter Reihenfolge der Seiten), oder sollte die Reihenfolge bei dir völlig frei sein?

    Dann wäre evtl. mit WPF ähnlich dem 'Browser' Stil:
    Übersicht über die Navigation
    http://msdn.microsoft.com/de-de/library/ms750478.aspx
    Freitag, 10. September 2010 12:58
  • Frage daher:
    entspricht dein 'Wechseln der Seiten' von der Art her einem Wizard (mit [vor-]bestimmter Reihenfolge der Seiten), oder sollte die Reihenfolge bei dir völlig frei sein?

    Ehrlich gesagt ein Mix zwischen Beidem.

    Also zuerst soll eine art Begrüßungsbildschirm angezeigt werde, wenn man dann auf 'Weiter' klickt kommt man ins Hauptmenü, wo man zwischen einzelnen 'Unterprogrammen' auswählen kann. Von diesen 'Unterprogrammen' soll man aber auch wieder ins Hauptmenü kommen. Also keine wirkliche Browser Architektur. Für das 'zurück gehen ins Hauptmenü' würde ich einen separaten Button vorsehen. Das alles halt in einem Fenster ...

    werd mir aber mal deine Tutorials anschaun und sehn was ich verwenden kann, vorraussichtlich Sonntag, morgen bin ich nicht da.

    Freitag, 10. September 2010 17:20
  • Hallo Niklas,

    zunächst Glückwunsch zum Umstieg, WPF mit C# ist eine gute Entscheidung. Gerade auch für UI-Dinge.
    Die richtige Gruppe für WPF ist aber eher das Forum [WPF], aber ich habe hier ja zufällig auch mal hereingeschaut.




        > 1) ob es auch in WPF UserControls gibt?

    ja natürlich.

    [UserControl-Klasse (System.Windows.Controls)]
    http://msdn.microsoft.com/de-de/library/system.windows.controls.usercontrol.aspx

    [Exemplarische Vorgehensweise: Hosten eines zusammengesetzten WPF-Steuerelements in Windows Forms]
    http://msdn.microsoft.com/de-de/library/ms745781.aspx

    [WPF: Anpassen von Steuerelementen für Windows Presentation Foundation]
    http://msdn.microsoft.com/de-de/magazine/cc163421.aspx

    [Video Training - WindowsClient.net]
    http://windowsclient.net/learn/video.aspx?v=76360




         >  wie man dann das 'Wechseln der Seiten' am besten realisieren würde?

    Tatsächlich ist heutzutage dafür sicher [Prism (Composite Client Application Guidance)] state of the art, um dieses Problem sehr sauber anzugehen. Dennoch würde ich Dir empfehlen - wo Du ja erst anfängst - erstmal ganz normale UserControl's zu bnutzen, da Du so auch erstmal schneller ans Ziel kommst. Ich sehe bei reinen Seitenwechseln keinen Wizard-Ansatz als vorteilhaft. Also eine Art Masterpage willst Du ja schon haben. Das ist dann vielleicht im ersten Step für Dich einfach die MainWindow.xaml, in der Du zum Beispiel ein ContentControl/ItemsControl/StackPanel hast, in die die Instanzen der anderen Seiten dann zum gewünschten Zeitpunkt gesetzt werden.
    Die Seiten kann man einfach als einzelne XAML Views (oh ja, später dann mal MVVM andenken ;-) umsetzen. Zur Laufzeit setzt man einfach die Content-Eigenschaft der ContentControls (oder entsprechend) auf die neu instanziierte View. Hier vielleicht auch Ansätze:
         [Magellan Shared Layouts - Master Pages for WPF]   /  [WPF MasterPage - CodeProject]  /  [WPF Master Pages - CodeProject]
    Wenn Du einen Browser-artikge Seiten-Anwahl nutzen möchtest, könnte ggf. die Nutzung des NavigationService über den Navigation-Namespace in WPF vorteilhaft sein, wenn das eher ein TreeView-Neuanwahl links ist, nicht so sehr, aber auch möglich. Dass natürlich auch viele [WPF-Grundlagen] gleichzeitig mit der Erstellung Deiner UserControl-Lösung erworben werden müssen/sollten, liegt natürlich in der Natur der Sache.

     


    ciao Frank
    Freitag, 10. September 2010 17:53
  • Hey, danke schon mal für die zahlreichen antworten.

    War die letzte Woche auf Abifahrt und werd mir mal die ganzen Sachen von euch ansehn. Da ist bestimmt was dabei was ich brauchen kann ;)

    Vielen Danke schon mal jetzt, bei weiteren Fragen wende ich mich natürlich wieder an euch.

    Montag, 20. September 2010 15:55
  • hab nun wieder ein kleines Problem ...

    in dem Video Tutorial wird ja der UserControl durch xaml hinzugefügt, ich würd ihn aber gerne direkt im quellcode hinzufügen, da ich da später eh nicht drum herum komm mit dem Wechsel der Seiten. Nun habe ich das ganze so versucht:

     

            public MainWindow()

            {

                InitializeComponent();

                this.AddChild(new WelcomeView());

            }

     

    Nun tritt ein Laufzeitfehler auf:

    Zeilennummer "3" und Zeilenposition "9" von "Durch den Aufruf des Konstruktors für Typ "SportSim.MainWindow", der den angegebenen Bindungseinschränkungen entspricht, wurde eine Ausnahme ausgelöst.".

    Mittwoch, 22. September 2010 07:09
  • Hallo Niklas,

    Wenn wir folgendes Projekt als Grundlage benutzen: [HowToCreateaUserControlinWPFSourceCode]

    ... dann im XAML also die Initialisierung herausnehmen .... also etwa:

    <Window x:Class="UserControlDemo.Window1"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:uc1="clr-namespace:UserControlDemo"
     Title="Window1" Height="300" Width="300">
     <Grid/>
    </Window>
    
    

    _________________________

     public Window1()
     {
     InitializeComponent();
     Grid grid = Content as Grid;
     grid.Children.Add(new Timer());
     }
    

    ____________________

    Das Window kann nur ein Child beihalten. Wenn Du also auch noch das Grid aus dem XAML herausnimmst, könntest Du auch Deine Konstruktion:

     public Window1()
     {
      InitializeComponent();
      this.AddChild(new Timer());
     }

    benutzen. 


    ciao Frank
    Mittwoch, 22. September 2010 07:20
  • vielen Dank ...

    noch eine allgemeine Frage: wär es eigentlich nicht besser 'Pages' anstatt 'UserControls' zu verwenden?

    weil dazu gäb es dann sogar vorimplementierte Methoden für Buttons wie 'NextPage' oder 'LastPage' ... ???

    ________________________________________________________

    les grad das Pages für Webseiten bestimmt ist?

    Mittwoch, 22. September 2010 08:11
  • Hallo Niklas,

    zunächst Glückwunsch zum Umstieg, WPF mit C# ist eine gute Entscheidung. Gerade auch für UI-Dinge.
    Die richtige Gruppe für WPF ist aber eher das Forum [WPF], aber ich habe hier ja zufällig auch mal hereingeschaut.




        > 1) ob es auch in WPF UserControls gibt?

    ja natürlich.

    [UserControl-Klasse (System.Windows.Controls)]
    http://msdn.microsoft.com/de-de/library/system.windows.controls.usercontrol.aspx

    [Exemplarische Vorgehensweise: Hosten eines zusammengesetzten WPF-Steuerelements in Windows Forms]
    http://msdn.microsoft.com/de-de/library/ms745781.aspx

    [WPF: Anpassen von Steuerelementen für Windows Presentation Foundation]
    http://msdn.microsoft.com/de-de/magazine/cc163421.aspx

    [Video Training - WindowsClient.net]
    http://windowsclient.net/learn/video.aspx?v=76360




         >  wie man dann das 'Wechseln der Seiten' am besten realisieren würde?

    Tatsächlich ist heutzutage dafür sicher [Prism (Composite Client Application Guidance)] state of the art, um dieses Problem sehr sauber anzugehen. Dennoch würde ich Dir empfehlen - wo Du ja erst anfängst - erstmal ganz normale UserControl's zu bnutzen, da Du so auch erstmal schneller ans Ziel kommst. Ich sehe bei reinen Seitenwechseln keinen Wizard-Ansatz als vorteilhaft. Also eine Art Masterpage willst Du ja schon haben. Das ist dann vielleicht im ersten Step für Dich einfach die MainWindow.xaml, in der Du zum Beispiel ein ContentControl/ItemsControl/StackPanel hast, in die die Instanzen der anderen Seiten dann zum gewünschten Zeitpunkt gesetzt werden.
    Die Seiten kann man einfach als einzelne XAML Views (oh ja, später dann mal MVVM andenken ;-) umsetzen. Zur Laufzeit setzt man einfach die Content-Eigenschaft der ContentControls (oder entsprechend) auf die neu instanziierte View. Hier vielleicht auch Ansätze:
         [Magellan Shared Layouts - Master Pages for WPF]   /  [WPF MasterPage - CodeProject]  /  [WPF Master Pages - CodeProject]
    Wenn Du einen Browser-artikge Seiten-Anwahl nutzen möchtest, könnte ggf. die Nutzung des NavigationService über den Navigation-Namespace in WPF vorteilhaft sein, wenn das eher ein TreeView-Neuanwahl links ist, nicht so sehr, aber auch möglich. Dass natürlich auch viele [WPF-Grundlagen] gleichzeitig mit der Erstellung Deiner UserControl-Lösung erworben werden müssen/sollten, liegt natürlich in der Natur der Sache.


    ciao Frank

    Also das mit dem Einfügen von UserControls hab ich jetzt kapiert, nur noch nicht das Wechseln der UserControls.

    Ich hätte mir das in etwa so vorgestellt: Durch das Klicken des Buttons wird ein Event ausgelöst (zB next_Click), anstatt dieses Event jedoch direkt im UserControl zu bearbeiten, würde ich es schon im Hauptfenster abfangen und dann die Seiten wechseln ...

    nun ist die Frage wie ich solche Events 'abfangen' kann?

    Mittwoch, 22. September 2010 08:53
  • Hallo Niklas,

        > noch eine allgemeine Frage: wär es eigentlich nicht besser
        > 'Pages' anstatt 'UserControls' zu verwenden?

    [When should I use a UserControl instead of a Page? - Stack Overflow]
    http://stackoverflow.com/questions/2622392/when-should-i-use-a-usercontrol-instead-of-a-page

    und wie am Anfang von mir erwähnt:

    Zitat: "Wenn Du einen Browser-artikge Seiten-Anwahl nutzen möchtest, könnte ggf. die Nutzung des NavigationService über den Navigation-Namespace in WPF vorteilhaft sein, ... ".

    WPF verwendet dann das Journal, um Seiten zu speichern, von denen weg navigiert wurde, und um wieder zu den Seiten zurück zu navigieren:

    [Übersicht über die Navigation]
    http://msdn.microsoft.com/de-de/library/ms750478.aspx#NavigationHistory

    Er speichert sich das in einem JournalEntry und Du hast u.a. eine GoForward und eine GoBackward-Methode (NavigationService.GoBack ...):

    [JournalEntry-Klasse (System.Windows.Navigation)]
    http://msdn.microsoft.com/de-de/library/system.windows.navigation.journalentry.aspx

    [NavigationService.GoBack-Methode (System.Windows.Navigation)]
    http://msdn.microsoft.com/de-de/library/system.windows.navigation.navigationservice.goback(VS.95).aspx


    ___________


       >  Also das mit dem Einfügen von UserControls hab ich jetzt kapiert,
       >  nur noch nicht das Wechseln der UserControls.

    gut, also zurück zum UserControl-Szenario:
    Nehmen wir mal an, Du hättest ein:    <Grid Name="grid" ></Grid>
    dann wäre ein Ersatz/Wechsel zum neuen UserControl (hier Timer) zum Beispiel so machbar:

        grid.Children.Clear();
        grid.Children.Add(new Timer());

     


    ciao Frank
    Mittwoch, 22. September 2010 09:37
  • Browser-artig will ich es eigentlich nicht haben ... mit den Navigationspfeilen, etc.

    und den neuen UserControl einzufügen ist eigentlich auch kein problem, mein problem besteht eher darin, wie ich dem Hauptfenster mitteilen soll, dass er das nächste UserControl einblenden soll ... das Einfügen an sich ist nicht das Problem.

    Ich will ja die Information, dass im UserControl ein Button geklickt wurde, an das Hauptfenster weiterleiten, damit dieses dann den Seitenwechsel vornehmen kann

    Mittwoch, 22. September 2010 10:05
  • Hallo Niklas,

    das geht trotzdem auch in WPF oft gut mit:

    [NavigationCommands-Member (System.Windows.Input)]
    http://msdn.microsoft.com/de-de/library/system.windows.input.navigationcommands_members.aspx

    Also die Semantik eines "explitziten Page-Wechsels" zum Beispiel mit folgendem Command (es könnte auch ein eigenes sein) :

    [NavigationCommands.GoToPage-Eigenschaft (System.Windows.Input)]
    http://msdn.microsoft.com/de-de/library/system.windows.input.navigationcommands.gotopage.aspx

    Das UserControl schickt dann einfach das Kommando ab (ggf. ohne Wissen darüber, wer das dann letztlich handelt - oder als Variante an ein höher gegelegenes CommandTarget) und man kann dann ggf. auch den Handler für CanExecute und Execute (oder CanExecuteChanged) implementieren. Im nächsten Posting ist ein einfaches Beispiel dafür:


    ciao Frank

    Mittwoch, 22. September 2010 10:59
  • als einfaches Beispiel also:

    Timer.xaml (das UserControl):

    <UserControl x:Class="UserControlDemo.Timer"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Height="30" Width="160">
     <StackPanel Orientation="Horizontal" >
     <TextBlock Margin="2,2,2,2" Name="_ElapsedTime" MinWidth="30"></TextBlock>
     <Button 
     Command="GoToPage" CommandParameter="Meine neue Seite" 
     Click="StartTimer">Start Timer</Button>
     <Button Click="StopTimer">Stop Timer</Button>
     </StackPanel>
    </UserControl>
    


    ______________

    Window1.xaml.cs:

     public partial class Window1 : Window
     {
     public Window1()
     {
     InitializeComponent();
     grid.Children.Clear(); 
     grid.Children.Add(new Timer());
     }
    
     private void OnGoToPage(object sender, ExecutedRoutedEventArgs e)
     {
     MessageBox.Show("Kommando GoToPage erhalten ... \n" +
     "mit Parameter: \"" + e.Parameter + "\", \n" +
     "von Element-Typ: \"" + e.Source.GetType().FullName + "\"");
    // hier dann UserControl ggf. wechseln ... } }

    ciao Frank
    Mittwoch, 22. September 2010 11:19
  • ok, der Navigation-Service sieht schon mal nicht schlecht aus, kann man aber die Navigationsleiste am oberen Rand ausblenden?

    also die mit dem Pfeil für zurück und vorwärts? Ich brauch das nämlich nicht für meine Applikation und möchte die Navigation rein mit meinen Buttons handhaben ...

    Mittwoch, 22. September 2010 11:55
  • Niklas,

        > NavigationService ...

    in meinem Beispiel nutze ich ja den NavigationService gar nicht, sondern nur das Kommando dafür. Da wird also auch keine Navigationsleiste angezeigt.
    Wir sollten bei neuen Fragen besser einen neuen Thread aufmachen, wenn Du hier bzgl. Deiner Ausgangs-Frage alles klar ist. Dann ggf. am Ende die Postings bewerten

    Um die bei einem NavigationWindow zugehörige Navigations-Benutzeroberfläche nicht sichtbar zu machen, kannst Du die folgende Eigenschaft auf false setzen:

    [NavigationWindow.ShowsNavigationUI-Eigenschaft (System.Windows.Navigation)]
    http://msdn.microsoft.com/de-de/library/system.windows.navigation.navigationwindow.showsnavigationui.aspx


    ciao Frank
    Mittwoch, 22. September 2010 12:05
  • ok vielen dank nochmal, jetzt ist alles klar bei mir ^^

    bei neuen Fragen mach ich sicher einen neuen Thread auf ...

    nochmals vielen Dank, hast mir echt weiter geholfen

    ciao

    Niklas

    Mittwoch, 22. September 2010 12:18
  • Hallo Niklas,

       > nochmals vielen Dank, hast mir echt weiter geholfen

    gern :-) 

     


    ciao Frank
    Mittwoch, 22. September 2010 12:21
  • als einfaches Beispiel also:

    Timer.xaml (das UserControl):

    <UserControl x:Class="UserControlDemo.Timer"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Height="30" Width="160">
     <StackPanel Orientation="Horizontal" >
     <TextBlock Margin="2,2,2,2" Name="_ElapsedTime" MinWidth="30"></TextBlock>
     <Button 
     Command="GoToPage" CommandParameter="Meine neue Seite" 
     Click="StartTimer">Start Timer</Button>
     <Button Click="StopTimer">Stop Timer</Button>
     </StackPanel>
    </UserControl>
    


    ______________

    Window1.xaml.cs:

     public partial class Window1 : Window
     {
     public Window1()
     {
     InitializeComponent();
     grid.Children.Clear(); 
     grid.Children.Add(new Timer());
     }
    
     private void OnGoToPage(object sender, ExecutedRoutedEventArgs e)
     {
     MessageBox.Show("Kommando GoToPage erhalten ... \n" +
     "mit Parameter: \"" + e.Parameter + "\", \n" +
     "von Element-Typ: \"" + e.Source.GetType().FullName + "\"");
    // hier dann UserControl ggf. wechseln ... } }

    ciao Frank
    sry, aber wirklich noch ne aller letzte Frage ... wenn ich das ganze mit Command="..." mach wird der Button automatisch deaktiviert und kann ihn somit nicht mehr benutzen?
    Mittwoch, 22. September 2010 13:22
  • Hallo Niklas,

    ja, das ist erstmal in diesem Fall standardmäßig deaktiviert. Du müsstest hier ja (übergeordnet) noch definieren, wann der Button drückbar sein darf (->CanExecute - Handler). Der DocumentViewer und der FlowDocumentPageViewer unterstützen das Kommando nativ (out of the box), da würde es automatisch aktiviert und ggf. deaktiviert werden.

    Um das zu aktivieren kannst Du zum Beispiel ein CommandBinding in den Ressourcen definieren und dort im CanExecute-Handler ein e.CanExecute auf true setzen.
    Ich habe Dir der Einfachheit halber ein Beispiel-Projekt zum Download dafür bereitgestellt:

    Download: http://Dzaebel.NET/Downloads/UserControlDemo.zip

    natürlich könntest Du auch schon im UserControl festlegen, dass der Button immer ausführbar ist:

                  CommandManager.CanExecute="Button_CanExecute"
    nebst:     e.CanExcute = true; im Button_CanExecute Handler.


    ciao Frank

    Mittwoch, 22. September 2010 19:17
  • danke ... nochmals :)

    hab das Beispiel schon gedownloaded und gestartet, funktioniert einwandfrei ... denk mal das wird mir weiterhelfen ^^

    Donnerstag, 23. September 2010 15:49
  • Hab das gleiche Problem.

    Danke für den Link!

    Grüße

    Samstag, 9. Oktober 2010 21:22