Merci à Cette question (cliquez sur moi!) , j'ai la propriété Maintenant, je voudrais réaliser deux autres objectifs: p> J'ai le marquage XAML suivant (non fonctionnel) pour le moment: p> Je suis sûr que le problème est que existe-t-il un moyen de connecter les propriétés attachées (comme je l'ai fait avec Comment écrire le Source code> de mon < Code> WebBrowser Code> Binding correctement à ma viewModel.
isenabled code> de mes boutons de mon dos et d'avant pour se lier correctement au
CANGOBACK code> et
CANGOFORWARD code> Propriétés du WebBrowser
/ code>. li>
goforward () code> et
goback () code> Méthodes sans recourir au code-derrière et sans la viewModel qui doit connaître le
WebBrowser CODE>. LI>
ol>
cangoback code> et
cangoforward code> ne sont pas des propriétés de dépendance (et ne mettez pas d'implémenter
inotifychanged code>), mais je ne suis pas tout à fait sûr de savoir comment se déplacer. P>
source code>) ou quelque chose de similaire pour obtenir le
cangoback code> et
cangoforward Code> Les liaisons au travail? P> li>
gobackcommand code> et
goforwardcommand code> afin qu'ils soient indépendants du code-derrière et de la vieilleModel et peuvent être déclarés dans le balisage? P> < / li>
ol> p>
3 Réponses :
J'ai utilisé cela dans mon wrapper WebBrowser liable:
private void CanBrowseBack(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = webBrowser.CanGoBack; } private void BrowseBack(object sender, ExecutedRoutedEventArgs e) { webBrowser.GoBack(); } private void CanBrowseForward(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = webBrowser.CanGoForward; } private void BrowseForward(object sender, ExecutedRoutedEventArgs e) { webBrowser.GoForward(); } private void TrueCanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; } private void Refresh(object sender, ExecutedRoutedEventArgs e) { try { webBrowser.Refresh(); } catch (Exception ex) { PmsLog.LogException(ex, true); } } private void Stop(object sender, ExecutedRoutedEventArgs e) { mshtml.IHTMLDocument2 doc = WebBrowser.Document as mshtml.IHTMLDocument2; if (doc != null) doc.execCommand("Stop", true, null); } private void GoHome(object sender, ExecutedRoutedEventArgs e) { Source = new Uri(Home); }
@Botz, merci. Je suis un peu brumeux sur la façon dont vous avez réellement configuré votre classe code> Cadra FrameworkElement. Je suppose que vous avez un champ webbrowser code>, mais comment l'obtenez-vous réellement à afficher? Je pensais que j'aurais besoin de construire un
usercontrol code> et placez-la réellement le
webbrowser code> in, dites, un
grille code> sur le contrôle. Comment gérez-vous cela avec une classe qui hérite
FrameworkElement code>? Merci.
Vous n'avez réellement besoin d'un UserControl, un frameworkElement est tout aussi bien que vous le configurez correctement. Ma mise en œuvre pourrait ne pas être la meilleure, mais si vous souhaitez avoir un look, le contrôle peut être trouvé ici: Pastebin.com/ M492DBD3F (Si vous vous demandez à propos de BrowserviewModel, c'est la viewModel Les propriétés de la commande sont en réalité liées, je suis sûr que vous avez déjà votre propre point de vue) cependant)
// BTW Si vous découlez de l'établissement, vous pouvez appeler AddVisualChild et AddLogicalChild pour mettre le webbrowser ou quoi que ce soit d'autre à l'intérieur de celui-ci.
@Botz, ahh, sympa, merci. Cela fonctionne dans ma fenêtre en ce moment. J'ai juste besoin d'un indice sur la façon de se lier à la navigationCommands.browseback. J'ai essayé Command = "{élément de liaisonName = _instrucancewebrowser, chemin = NavigationCommands.browseforward}" Code> et
Commande = "{Navigation NavigationCommands.browseforward}" Code> Jusqu'ici chance. Merci encore!
@Botz, j'ai aussi essayé simplement commande = "navigationcommands.browseforward" code>, mais cela ne fonctionne pas non plus.
En fait, ce sont des commandes intégrées. Ils travaillent n'importe où dans votre application et sont liés de manière dynamique aux liaisons qui sont en vigueur pour l'élément actuellement en mise au point. Cela signifie également que différents contrôles peuvent chacun mettre en œuvre cette commande par elle-même et, selon laquelle on a l'accent, cette mise en œuvre est utilisée. Il suffit de les utiliser comme ceci: commande = "navigationcommands.browseforward" code> pour des éléments tels que Menuitems, même le texte est défini automatiquement simplement en le faisant.
Oh! Ouais, une chose était manquante. CommandTarget = "{élément de liaisonName = _instrucancewebrowser}"
Oui! ça fonctionne parfaitement maintenant. Merci pour votre aide :)
@ Botz3000: Souhaitez-vous laisser tomber le contrôle sur Pastebin pendant quelques jours, merci.
Votre question semble impliquer que, afin de mettre en œuvre correctement un modèle MVVM, vous n'êtes pas autorisé à avoir de code-indicatif. Mais peut-être ajouter que certains code-derrière à votre vue vous permettront beaucoup plus facile de le connecter avec votre modèle de vue. Vous pouvez ajouter des propriétés de dépendance à la vue et la laisser écouter pour inotifypropertychanged code> événements. P>
Pour quiconque appartient à cette question et veut une solution complète, c'est ici. Il combine toutes les suggestions faites dans ce fil et les threads liés (et d'autres personnes liées à). P>
xaml: http://pastebin.com/aed9PVW8 p>
C # Classe: http://pastebin.com/n6cw9zbb p>
Exemple d'utilisation XAML: http://pastebin.com/jpunrfq8 p>
Remarque: l'exemple suppose que votre vue se lie à une vue de vue qui fournit l'URL source au navigateur. Une barre de navigation très rudimentaire avec des boutons de dos, d'avant et de rafraîchissement et une barre d'adresse est fournie juste à la manifestation. P>
profiter. J'ai défini l'expiration sur ces pastebin pour jamais, ils devraient donc être disponibles aussi longtemps que la pâtebine existe. P>
Très gentil merci. Je me demandais ce que le _skipsourcechange est là pour?