IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

[WPF] Datatemplate & Tabcontrol


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut [WPF] Datatemplate & Tabcontrol
    Bonjour à tous,

    je ne trouve pas comment customisé le DataTemplate d'un TabItem sans créer de TabItem (si je crée un TabItem , je ne peux plus binder derrière).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <TabControl Grid.Row="2" Grid.Column="0" ItemsSource="{Binding Onglets}">
     
                  <TabItem>
                    <TabItem.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Height="20">
                                <TextBlock Text="Coucou" VerticalAlignment="Center" Margin="0,0,4,0" />
                                <Button Content="x" Width="20" Height="20" VerticalAlignment="Center"/>
                            </StackPanel>
                        </DataTemplate>
                    </TabItem.HeaderTemplate>
                    <TabItem.ContentTemplate>
                        <DataTemplate>
                            <WebBrowser Source="http://google.fr" />
                        </DataTemplate>
                    </TabItem.ContentTemplate>
                </TabItem>
            </TabControl>
    Si vous avez une idée...
    Merci d'avance

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Salut,

    tu peux le faire comme ça :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      <TabControl >
          <TabControl.ItemTemplate>
            <DataTemplate>
               <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Height="20">
               <TextBlock Text="Coucou" VerticalAlignment="Center" Margin="0,0,4,0" />
              <Button Content="x" Width="20" Height="20" VerticalAlignment="Center"/>
              </StackPanel>
            </DataTemplate>
          </TabControl.ItemTemplate>
     
        </TabControl>

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Nickel, merci ca passe par contre comment spécifier que que le contenu du TabItem sera toujours un WebBrowser ?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Tu disposes de ContentTemplate :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      <TabControl >
          <TabControl.ContentTemplate>
            <DataTemplate>
              <WebBrowser Source="http://google.fr" />
            </DataTemplate>
          </TabControl.ContentTemplate>
     
        </TabControl>

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    En effet j'avais pas vue merci bien !

    Du coup je me retrouve avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            <TabControl Grid.Row="2" Grid.Column="0" ItemsSource="{Binding Onglets}">
                <TabControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Height="20" Width="100">
                            <TextBlock Text="{Binding Web, Converter={StaticResource Converter1}}" VerticalAlignment="Center" Margin="0,0,4,0" HorizontalAlignment="Left"/>
                            <Button Content="x" Width="20" Height="20" VerticalAlignment="Center" HorizontalAlignment="Right" Click="CloseOnglet_Click"/>
                        </StackPanel>
                    </DataTemplate>
                </TabControl.ItemTemplate>
                <TabControl.ContentTemplate>
                    <DataTemplate>
                        <ContentPresenter Content="{Binding Web}" />
                    </DataTemplate>
                </TabControl.ContentTemplate>
            </TabControl>
    Donc la navigation par onglet fonctionne, j'ai au dessus de ceci une Textbox (pour la barre d'adresse) j'aimerai qu'en fonction du TabItem sélectionné l'url se mette dans ce TextBox et je ne sais pas comment binder sur un élément précis de mon ObservableCollection (si cela est possible par binding).

    De plus mon converter qui est censé transformer mon WebBrowser en String pour indiquer le site dans le textblock du TabItem ne fonctionne pas (renvoie String.Empty tout le temps). Dans image.Source ... il ne semble rien y avoir ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        class Converter_WebBrowser_String : IValueConverter
        {
     
            #region IValueConverter Membres
     
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                WebBrowser Web = (WebBrowser)value;
                String Url = Web.Source.ToString();
                //String Url = Web.Source.OriginalString;
                return (Url);
            }
     
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
     
            #endregion
        }
    À moins que je n'utilise pas la bonne propriété. (j'ai quasi tout essayé ce qui se trouve dans Web.Source).


    Merci d'avance.
    Cordialement,
    NeoKript

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Pour ta TextBox (barre d'adresse), tu dois pouvoir t'en sortir comme ça :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
        <TextBox Height="22" Text="{Binding ElementName=TabControl1, Path=SelectedItem.Web.Source}" />
    où TabControl1 est le nom de ton TabControl


    Citation Envoyé par NeoKript
    De plus mon converter qui est censé transformer mon WebBrowser en String pour indiquer le site dans le textblock du TabItem ne fonctionne pas (renvoie String.Empty tout le temps).
    Il faut noter une chose sur le WebBrowser c'est que la propriété Source n'est pas une DependencyProperty. Donc lorsque tu modifies celle-ci, tu ne vas pas être notifié. Tu ne passes dans ton Converter qu'au début (avant que la propriété source ne soit initialisé je pense).

    Tu vas surement devoir abonner ton webBrowser à l'évènement Navigated (ou Navigating) pour changer le titre de tes TabItem

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Citation Envoyé par binoo Voir le message
    Pour ta TextBox (barre d'adresse), tu dois pouvoir t'en sortir comme ça :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
        <TextBox Height="22" Text="{Binding ElementName=TabControl1, Path=SelectedItem.Web.Source}" />
    où TabControl1 est le nom de ton TabControl
    J'ai essayé mais ca ne marche pas c'est un peu plus complexe que ca je pense car mon DataContext n'est pas this mais une classe extérieur, l'ObservableCollection (Onglets) est dans la classe extérieur.


    Citation Envoyé par binoo Voir le message
    Il faut noter une chose sur le WebBrowser c'est que la propriété Source n'est pas une DependencyProperty. Donc lorsque tu modifies celle-ci, tu ne vas pas être notifié. Tu ne passes dans ton Converter qu'au début (avant que la propriété source ne soit initialisé je pense).

    Tu vas surement devoir abonner ton webBrowser à l'évènement Navigated (ou Navigating) pour changer le titre de tes TabItem
    Avec navigating, dans l'argument de l'event j'arrive à récupérer l'URL (mais pas le titre)

    D'ailleurs, je fait comme ca pour setter mon Url
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            void Navigating(object sender, NavigatingCancelEventArgs e)
            {
                WebBrowser B = sender as WebBrowser; ;
                for (int i = 0; i < this._Onglets.Count; i++)
                {
                    if (B == this._Onglets[i].Web)
                    {
                        this._Onglets[i].Url = e.Uri.OriginalString;
                        return;
                    }
                }
     
            }
    Je trouve cela un peu sale, comment ferriez-vous ? Peut-être une classe qui hérite de WebBroser contenant en plus l'attribut Url Comme ca je fait seulement une ObservableCollection de ma classe héritant de WebBrowser et je peux ainsi caster mon sender en ma classe et faire direct le changement sans boucle ?

    Merci encore.
    Désolé pour toutes mes questions ^^

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Citation Envoyé par NeoKript
    Peut-être une classe qui hérite de WebBroser contenant en plus l'attribut Url Comme ca je fait seulement une ObservableCollection de ma classe héritant de WebBrowser et je peux ainsi caster mon sender en ma classe et faire direct le changement sans boucle ?
    Oui ou en gardant ton idée de classe :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
      public class Webb : INotifyPropertyChanged {
        private string _path;
        public string Path {
          get { return this._path; }
          set {
            if (value == this._path)
              return;
     
            this._path = value;
            this.OnPropertyChanged("Path");
          }
        }
        public WebBrowser Web { get; set; }
     
        public Webb(string source) {
          this.Web = new WebBrowser();
          this.Web.Navigated += new System.Windows.Navigation.NavigatedEventHandler(Web_Navigated);
          this.Web.Navigating += new System.Windows.Navigation.NavigatingCancelEventHandler(Web_Navigating);
          this.Web.Source = new Uri(source);
          this.Path = source;
        }
     
        void Web_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) {
          if (this.Web.Source != null)
            this.Path = this.Web.Source.OriginalString;
        }
     
        void Web_Navigating(object sender, System.Windows.Navigation.NavigatingCancelEventArgs e) {
          if (this.Web.Source != null)
            this.Path = this.Web.Source.OriginalString;
        }
     
        #region INotifyPropertyChanged Members
     
        public event PropertyChangedEventHandler PropertyChanged;
     
        protected virtual void OnPropertyChanged(string propertyName) {
          if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
     
        #endregion // INotifyPropertyChanged Members
     
      }
     
    }

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    using System.Windows.Controls;
    using System.Collections.ObjectModel;
    using System;
    using System.ComponentModel;
     
    namespace WpfApplication1 {
     
      public partial class Window1 : Window {
     
        private ObservableCollection<Webb> Onglets = new ObservableCollection<Webb>();
     
        public Window1() {
          InitializeComponent();
     
          this.Onglets.Add(new Webb("http://google.fr"));
          this.Onglets.Add(new Webb("http://www.sports.fr/"));
          this.Onglets.Add(new Webb("http://google.fr"));
     
          this.TabControl1.DataContext = this.Onglets;
        }
     
        private void CloseOnglet_Click(object sender, RoutedEventArgs e) {
     
        }
     
      }

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <Window 
      x:Class="WpfApplication1.Window1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:l="clr-namespace:WpfApplication1"
      Title="Window1" Height="300" Width="300"
      >
     
      <Window.Resources>
     
     
      </Window.Resources>
     
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition Height="22" />
          <RowDefinition />
        </Grid.RowDefinitions>
     
        <TextBox Grid.Row="0" Text="{Binding ElementName=TabControl1, Path=SelectedItem.Path}" />
     
        <TabControl x:Name="TabControl1" Grid.Row="1" ItemsSource="{Binding }">
          <TabControl.ItemTemplate>
            <DataTemplate>
              <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Height="20" Width="100">
                <TextBlock Text="{Binding Path}" VerticalAlignment="Center" Margin="0,0,4,0" HorizontalAlignment="Left"/>
                <Button Content="x" Width="20" Height="20" VerticalAlignment="Center" HorizontalAlignment="Right" Click="CloseOnglet_Click"/>
              </StackPanel>
            </DataTemplate>
          </TabControl.ItemTemplate>
          <TabControl.ContentTemplate>
            <DataTemplate>
              <ContentPresenter Content="{Binding Web}" />
            </DataTemplate>
          </TabControl.ContentTemplate>
        </TabControl>
      </Grid>
     
     
    </Window>

  9. #9
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Héhé tout passe je te remercie !

    Je peux ajouter, close mes onglets et tout !

    Il me reste juste 2-3 choses à trouver :
    - Trouver le <title></title> de la page en parssant le contenue du WebBrowser ?
    J'ai fait ceci pour infos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            void Navigated(object sender, NavigationEventArgs e)
            {
                HTMLDocumentClass H = (HTMLDocumentClass)this.Web.Document;
                this.Title = H.title;
            }
    Cependant ya certain site ou le titre est vide (genre Youtube... pourtant youtube à un site ...)
    - Le favicon, je ne sais pas trop comment faire (peut-etre avec la classe WebClient et la méthode DowloadFile() pour télécharger l'icone ou le récupérer dans une flux. Je vais voir ca.
    - Et la plus importante intercepter le click sur les lien html afin que pour le click milieu ouverture d'un nouvel onglet et pour le moment le click sur des nouvelles pages me lance Internet Explorer ce qui n'est pas très pratique ^^ J'ai cru trouver sur le net qu'il faut utiliser HtmlElementCollection et redéfinir les propriété click ... à suivre ^^

    Cordialement,
    NeoKript

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WPF] DataTemplate et IValueConverter: "type inconnu" ?!
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 22
    Dernier message: 03/05/2010, 18h26
  2. [WPF] ajouter dynamiquement un control dans un dataTemplate.
    Par maa dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 28/02/2008, 08h20
  3. [WPF] datatemplate acces aux controls
    Par MrCyprom dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 21/09/2007, 16h17
  4. [WPF]TabControl dans un TabItem
    Par guitoux1 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 15/06/2007, 19h22
  5. [WPF] ControlTemplate - DataTemplate - Style ?
    Par PlaTyPuSs dans le forum Windows Presentation Foundation
    Réponses: 23
    Dernier message: 10/05/2007, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo