Akadémia alcsoport

Keresés

WPF-es Children és az Item Control-ok

A legutóbbi, K, márc. 23 2010 12:38 tárgyú bejegyzést Hermann Mihály írta. 10 válasz.
  • Cs, márc. 11 2010 14:35

    WPF-es Children és az Item Control-ok

    Sziasztok!

     

    Olyan kérdésem lenne, hogy WPF alatt hogyan tudom az Item Controlok Tag-jeit levizsgálni, és szükség esetén pl Menu elemnél a Header-be írni?

    Nem sikerült megoldanom sem cast-olással, sem egyéb módon az átvitelt, hogy az almenüket is le tudjam kérdezni. Odáig eljutottam, hogy kiírja, hogy mi a Header és mennyi elemet tartalmaz, de tovább nem :(

    Tömbbe beolvasom egy TXT tartalmát, és a tömb sorszámai alapján szeretném a Tag alapján átírni a szükséges Header-t, Text-et, Content-et.... if (Menüelem is MenuItem/ToolBarTray/Button/egyéb) valami.Text/Content/egyéb (tipustól függően) = Array[i];

    for (int i = 0; i < grid1.Children.Count; i++)
                {
                    if (grid1.Children[i] is Label)   // A Label elemet át tudtam írni. Egy volt összesen, de ha több van, akkor is működik így? Még nem próbáltam ki, valaki fejből?
                    {
                        alabel = (Label)grid1.Children[i] as Label;
                        int tag;
                        tag = Int32.Parse((string)alabel.Tag);
                        alabel.Content = lang.nyelvt[tag];
                        // Nincs ennél egyszerűbb megoldás, mint pl Delphi-nél? Ott van ClassName is és csak lekérdezem, hogy mi a neve és az alapján a Tag-et is le lehet kérdezni. Kód lent.
                    }

                    if (grid1.Children[i] is Menu)
                    {
                        amenu = (Menu)grid1.Children[i] as Menu;
                        MessageBox.Show(amenu.Items.Count.ToString() + " " + amenu.Name); // Itt pl. kiírja, hogy a Header: fajl és 5 elemet tartalmaz: Count: 5

                        tag = Int32.Parse((string)almenu.Tag);
                        almenu.Header = lang.nyelvt[tag];
                    }

     

    Delphi-s kód:

          Cid:=-1;
          for cnt:=0 to foablak.ComponentCount-1 do
            if foablak.Components[cnt].Tag=id then Cid:=cnt;
          if id=100 then foablakcim:=txt;
          if Cid>=0 then
            begin
              Cname:=foablak.Components[Cid].ClassName;
              If Cname='TLabel' then With foablak.Components[Cid] as TLabel do Caption:=txt;
              If Cname='TButton' then With foablak.Components[Cid] as TButton do Caption:=txt;
              If Cname='TCheckBox' then With foablak.Components[Cid] as TCheckBox do Caption:=txt;
    //          If Cname='TComboBox' then With foablak.Components[Cid] as TComboBox do Items.AddStrings:=txt;
              If Cname='TGroupBox' then With foablak.Components[Cid] as TGroupBox do Caption:=txt;
    //          If Cname='TRadioButton' then With foablak.Components[Cid] as TRadioButton do Caption:=txt;
              If Cname='TTabSheet' then With foablak.Components[Cid] as TTabSheet do Caption:=txt;
              If Cname='TMenuItem' then With foablak.Components[Cid] as TMenuItem do Caption:=txt;
            end;

    ToolBarTray esetén gondolom hasonlóan működne, mint Menü esetén.

    Előre is köszi!

    • Pontok: 35
  • P, márc. 12 2010 10:46 Válasz erre:

    • Arvai Zoltan
    • Az első 10 közreműködő
    • Csatlakozott H, jún. 30 2008
    • Magyarország
    • Bejegyzések 930
    • Pontok 13 910

    Re: WPF-es Children és az Item Control-ok

    A WPF azért jó, mert nem kell ilyet csinálod... a WPF lelke az adatkötés... a beolvasott értékekből csinálsz mondjuk egy ojjektumot és az itemscontrol-t ahoz kötöd... a beolvasott objektumba tehetsz segéd property-ket pl, hogy meg kell jelenni, vagy nem stb...

     

    • Pontok: 20
  • P, márc. 12 2010 11:37 Válasz erre:

    Re: WPF-es Children és az Item Control-ok

    Próbálkoztam, de Attila mást javasolt és mondta, hogy majd küld át megoldási leírást, mert többnyelvű alkalmazást lenne, és ez bonyolultabb.

    • Pontok: 5
  • Szo, márc. 13 2010 12:36 Válasz erre:

    • Arvai Zoltan
    • Az első 10 közreműködő
    • Csatlakozott H, jún. 30 2008
    • Magyarország
    • Bejegyzések 930
    • Pontok 13 910

    Re: WPF-es Children és az Item Control-ok

     Ja hogy te itt lokalizálsz? :DD Oké... akkor a resource fájlok amik neked kellenek....

    http://jankajanos.spaces.live.com/Blog/cns!C3E2695FC6F7B0A4!492.entry

    Itt találsz egy jó leírás a cikk második felében!

    Üdv,

    Zoli

     

    • Pontok: 50
  • Szo, márc. 13 2010 13:17 Válasz erre:

    • Turoczy Attila
    • Az első 10 közreműködő
      Férfi
    • Csatlakozott H, jún. 30 2008
    • Budapest
    • Bejegyzések 988
    • Pontok 12 425

    Re: WPF-es Children és az Item Control-ok

    Pont Janka János cikkét akartam én is küldeni :)

    • Pontok: 5
  • Szo, márc. 13 2010 18:44 Válasz erre:

    Re: WPF-es Children és az Item Control-ok

    Köszönöm, mindkettőtöknek! Át fogom olvasni :)

    • Pontok: 5
  • H, márc. 22 2010 21:57 Válasz erre:

    Re: WPF-es Children és az Item Control-ok

    Átnéztem... Hát a második jóval bonyolultabbnak tűnik :(

    De az elsőnél is sokat kell gépelni xaml-ben és még a properties-t is használni kell. Adatkötéseket használ az első is, de mi van akkor, ha nem a properties-ben szeretném tárolni a szövegeket, hanem másban (pl: tömbben), mert úgy akár dinamikusan is lehet kezelni a nyelveket, és nem mindig nekem kell a dll-t elkészíteni, hanem akkor valaki elkészíti a fordítást és lehet is használni.

    Erről mi a véleményetek? Inkább az első lokalizációt használjam?

    • Pontok: 20
  • K, márc. 23 2010 10:03 Válasz erre:

    • bigbit
    • Az első 25 közreműködő
      Férfi
    • Csatlakozott K, júl. 1 2008
    • Bejegyzések 182
    • Pontok 2 825

    Re: WPF-es Children és az Item Control-ok

    A lokalizáció dinamikus futásközbeni nyelvváltásra és nagy mennyiségű szöveghez használhatatlan. Én xaml extensiont csináltam és azzal röptében fordítok. a fordításokat pedig a nyelv-váltáskor töltöm ha kell.

    pl:

     Title="{trl:Translate Text=Eladási Árak, Key=Title, Group=XX110}"

    • Pontok: 20
  • K, márc. 23 2010 10:51 Válasz erre:

    Re: WPF-es Children és az Item Control-ok

    bigbit:

     Title="{trl:Translate Text=Eladási Árak, Key=Title, Group=XX110}"

    Én is hasonlóra gondoltam (másodjára). Konkrétan arra, hogy (ha már Binding-et javasoltak), akkor a tömbből kiolvasom a Tag alapján a szövegeket, konkrétabban: tömb[Tag]; C# kódban, de xaml-ben nem sikerült elérnem, hogy kiolvassa. Bár a Binding még nem megy annyira.

    És javasolták még a lokalizációt, de kicsit hosszadalmas, és csak én tudom befordítani a programba, amit szeretnék elkerülni. Bár épp ma jutott az eszembe, hogy lehetnek "kedves" emberek, akik pl csúnya szavakat írnak a szöveg helyére, és azzal csak magamat égetném... Bár ha a fordító neve is megjelenne, akkor már saját magát, már ha beleírja.

    Szóval jó ez a lokalizáció, és vannak előnyei is, meg hátrányai is. :( Véleményem szerint.

    Amúgy a Binding nem kell a {} közé? Vagy csak nem írtad bele a sorba?

    • Pontok: 20
  • K, márc. 23 2010 11:10 Válasz erre:

    • bigbit
    • Az első 25 közreműködő
      Férfi
    • Csatlakozott K, júl. 1 2008
    • Bejegyzések 182
    • Pontok 2 825

    Re: WPF-es Children és az Item Control-ok

    Hali!

    "{trl:Translate Text=Eladási Árak, Key=Title, Group=XX110}"

    Ez nem binding hanem egy MarkupExtension

     

    namespace HW.Controls.Translator

    {

      [DebuggerStepThrough]

      [MarkupExtensionReturnType( typeof( string ) )]

      public class TranslateExtension : MarkupExtension, INotifyPropertyChanged

      {

        private TranslatorExtender transl;

     

        public TranslateExtension()

        {

          PropertyChanged+=new PropertyChangedEventHandler( TranslateExtension_PropertyChanged );

        }

     

        #region Translation parameters

     

        private string text;

        public string Text

        {

          get { return text; }

          set

          {

            text = value;

            notify( "Text" );

          }

        }

     

        private string group;

        public string Group

        {

          get { return group; }

          set

          {

            group = value;

            notify( "Group" );

          }

        }

     

        private string key;

        public string Key

        {

          get { return key; }

          set

          {

            key = value;

            notify( "Key" );

          }

        }

     

        private TranslateType translateType = TranslateType.FrameworkElement;

        public TranslateType TranslateType

        {

          get { return translateType; }

          set

          {

            translateType = value;

            notify( "TranslateType" );

          }

        }

     

        #endregion

     

        #region INotifyPropertyChanged Members && helper

     

        public event PropertyChangedEventHandler PropertyChanged;

     

     

        private void notify( string property )

        {

          if ( transl != null && !transl.Suppressed )

          {

            if ( PropertyChanged != null )

              PropertyChanged( this, new PropertyChangedEventArgs( property ) );

          }

        }

     

        private void TranslateExtension_PropertyChanged( object sender, PropertyChangedEventArgs e )

        {

          if ( transl != null && !transl.Suppressed )

          {

            switch ( e.PropertyName )

            {

            case "Group":

              transl.Group = Group;

              break;

     

            case "Text":

              transl.Text = Text;

              break;

     

            case "Key":

              transl.Key = Key;

              break;

     

            case "TranslateType":

              transl.TranslateType = TranslateType;

              break;

     

            }

          }

        }

     

        #endregion

     

        public override object ProvideValue( IServiceProvider serviceProvider )

        {

          object targetObject;

          DependencyProperty targetProperty;

          IProvideValueTarget targetHelper;

     

          targetHelper = (IProvideValueTarget) serviceProvider.GetService( typeof( IProvideValueTarget ) );

          targetObject = targetHelper.TargetObject;

          targetProperty = targetHelper.TargetProperty as DependencyProperty;

     

          if ( targetObject is FrameworkElement )

          {

            transl = TranslatorExtender.Get<TranslatorExtender>( targetObject as FrameworkElement );

            transl.TargetProperty = targetProperty;

     

            if ( !transl.Suppressed )

            {

              using ( transl.Suppress() )

              {

                transl.Text = Text;

                transl.Group = Group;

                transl.Key = Key;

                transl.TranslateType = TranslateType;

              }

            }

     

            return transl.GetTranslatedText();

          }

     

          return Text;

     

        }

     

      }


    • Pontok: 20
  • K, márc. 23 2010 12:38 Válasz erre:

    Re: WPF-es Children és az Item Control-ok

    Miket nézzek át ezekből?

    http://msdn.microsoft.com/en-us/library/system.windows.markup.markupextension.aspx

    http://msdn.microsoft.com/en-us/library/ms747254.aspx

    dinamikus: http://msdn.microsoft.com/en-us/library/ms748942.aspx

    Esetleg másokat is? Kicsit még sötét, hogy pontosan hogyan is működik.

    • Pontok: 5
Oldal 1 - 1 (11 elem) | RSS