• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    NECROMAN
    NECROMAN --- ---
    BAT: ono to jde, ale kazda z tech propert musi byt skutecna Properta, takze v pripade promenne
    public ServerSettings Server = new ServerSettings();
    to nepujde
    A stejne tak pokud to ma reagovat na zmenu, tak je nutne na kazdem clanku toho volani volat PropertyChanged
    BAT
    BAT --- ---
    Da se v XAML nabindovat jako zdroj parametr nejake tridy, kterazto je pristupna zase jako parametr jine tridy?
    ...asi se nevyjadruju moc jasne - priklad:
        public class ServerSettings : INotifyPropertyChanged {
            public string Address;
        }
    
        public sealed class Settings {
            public ServerSettings Server = new ServerSettings();
        }
    
    ...no a ja tedka chci nabindovat zdroj Settings.Instance.Server.Address.
    Zkousel jsem to bez uspechu vselijak, napr. takhle:
        <TextBlock Text="{Binding Source={x:Static local:Settings.Instance}, Path=Server.Address}" />
    Nicmene at se s hodnotou Address deje cokoliv, textblock je stale prazdny.
    Pokud to nabinduju pres ObjectDataProvider ktery vola metodu vracejici hodnotu Settings.Instance.Server.Address, tak to funguje.

    Mam blbe specifikovanou tu vazbu?
    ...napr. kdyz jsem jen Path=Server.Address nahradil volanim metody Path=VratAdresu, tak to funguje, takze asi je potreba to zapsat nejak jinak.

    (btw. nechce se mi jit cestou desitek ODP, technicky vzato je to asi totez, ale radsi bych tech 20+ radek kodu nenapsal).
    Znate prosim reseni?
    MORMEGIL
    MORMEGIL --- ---
    NECROMAN: E? To jsou dvě různé věci vždycky, String.Format používá composite format string, tzn. „{0:format}“, Int64.ToString() používá jen ten formát. Ale:
    x.ToString("D4");
    String.Format("{0:D4}", x);
    je snad totéž, ne?
    NECROMAN
    NECROMAN --- ---
    hmm, koukam, ze kdyz mam cislo long l, tak toto jsou 2 ruzne veci:
    l.ToString(format) a string.Format(format, l)
    BAT
    BAT --- ---
    Prosim vas pomozte mi nekdo, jsem z toho na mrtvici:

    MS Visual C# 2010 Express
    TreeView ma nabindovanou ObservableCollection a pouziva DataTemplate.
    Jak se dostanu na jednotlive TreeViewItems?
    Samozrejme jednotlivy polozky muzu snadno priadavat/menit/mazat provadenim pozadovanych uprav na patricne kolekci, ale napr...
    ...jak oznacim urcitou polozku? (TreeView.Items[3].IsSelected=true)
    ...jak sbalim urcitou vetev stromu?

    Asi by to slo pres pridane parametry "selected" a "expanded" v kolekci, ktere bych taky nabindoval na jejich ekvivalenty v ItemContainerStyle, ale proboha nejde tohle delat nejak normalne???
    Uz se s tim potykam celej den, Google uz ze mne musi bejt taky na nervy.

    Prece nejni mozny, ze clovek musi vytvaret takovy strasny konstrukce, jen aby dosahl tak jednoduchych a beznych veci?
    Co mi unika?
    3MARIE
    3MARIE --- ---
    tak me napadlo, proc by vlastne ta DLL nemohla mit ty Forms primo v sobe a ono to funguje ;-)
    3MARIE
    3MARIE --- ---
    TENCOKACISTROMY: ok. podivam se na to. diky.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    3MARIE: To ale zadnym nareferencovanim DLL nezaridis. To potrebujes meziprocesovou komunikaci.
    Inter-process communication - Wikipedia, the free encyclopedia
    http://en.wikipedia.org/wiki/Inter-process_communication
    Interprocess Communications (Windows)
    http://msdn.microsoft.com/en-us/library/aa365574%28v=vs.85%29.aspx
    3MARIE
    3MARIE --- ---
    TENCOKACISTROMY: takze potrebuju vyresit jak se nejakou dalsi .NET aplikaci pripojit na ten bezici process, tedy funkce v te DLL aktivni pod procesem, ktery ji spustil.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    3MARIE: Ne. Kdyz si nareferencujes tu DLL, tak se loaduje do procesu toho, kdo ji pouziva.
    3MARIE
    3MARIE --- ---
    TENCOKACISTROMY: jo. kdyz to DLL zaregistruju pres regasm, tak to DLL nejspis spousti system ne ? takze se z te .NET aplikace chci napojit na tu stejnou DLL.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    3MARIE: Cili se chces pripojit na jiz spustenej proces?
    3MARIE
    3MARIE --- ---
    TENCOKACISTROMY: delphi chci nainterfacovat na to DLL a z toho DLL potom chci posilat informace do .NET forms aplikace
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    3MARIE: Pockej a ty chces jen vyuzivat tu .NETovou assembly a nebo chces komunikovat mezi dvema bezicimi procesy?
    3MARIE
    3MARIE --- ---
    jeste me napadlo ze bych mezi tim DLL a Forms udelal taky COM link, ale v NET by to melo snad jit najak primo ne ?
    3MARIE
    3MARIE --- ---
    JACHYMKO: tak ten interface Delphi / .NET (exe) nejde z nejakyho duvodu rozchodit. Ale DLL Delphi zareferencujou v pohode. Takze bych to chtel udelat tak, ze Delphi komunikujou pres COM s DLL a DLL potom pres .NET s Forms applikaci (exe). Ted akorat nevim, jak propojit to DLL s Forms. Kdyz zareferencuju to DLL v Delphi i v .NET klientovi, tak vytvarim jeho instance, takze tudiz mi to do ty forms aplikace neproleze. Diky za radu.
    BAT
    BAT --- ---
    BAT: Tak jsem to prozatim prasacky vyresil takhle...

    Menu itemy vypadaji takto:
      <item Name="Polozka 1" ItemID="ITM1">
    DataTemplate pro menu itemy upraven takto:
      <MenuItem Header="{Binding XPath=@Name}" DisplayMemberPath="{Binding XPath=@ItemID}" Click="gsoTree_ContextMenu_Click">
    ...do DisplayMemberPath se ulozi retezec, podle ktereho potom uvnitr gsoTree_ContextMenu_Click poznam na kterou polozku menu se kliklo,
    a podle toho uz se muze provest patricna akce.
    DisplayMemberPath jsem nevybral nahodou, je to jedinej atribut menuitem do ktereho slo v datatemplate neco ulozit a pak to zase jinde ziskat.
    Sice je to pouzitelne, ale pripada mi to jako prasecina, a taky netusim jestli si timhle v budoucnu nenabehnu do nejakyho problemu.
    Takze pokud nekdo vite jak by to melo byt spravne, tak prosim poradte.
    BAT
    BAT --- ---
    Tak jsem to nakonec predelal pro WPF, a mam zas novej problem.

    Mam soubor "menu.xml" obsahujici definice ruznych menu, napr.:
      <Menus xmlns="">
        <Menu id="gsoTreeContextMenu">
          <item Name="Polozka 1"/>
          <item Name="Polozka 2"/>
        </Menu>
        ...
      </Menus>
    
    ...ktere takhle nabinduju:
      <XmlDataProvider x:Key="gsoMenuProvider" XPath="//Menus/Menu[@id='gsoTreeContextMenu']/*" Source="Resources\menus.xml" />
      ...
      <TreeView.ContextMenu>
        <ContextMenu>
          <ContextMenu.ItemsSource>
            <Binding Source="{StaticResource gsoMenuProvider}" XPath="//Menus/Menu[@id='gsoTreeContextMenu']/*" />
          </ContextMenu.ItemsSource>
        </ContextMenu>
      </TreeView.ContextMenu>
    
    No a ted bych do toho chtel dostat zpracovani udalosti kdyz se na urcitou polozku klikne.
    Predstavoval bych si to jako Hurvinek valku asi nejak takhle:
          <item Name="Polozka 1" Command="gsoTree_EditNode"/>
          <item Name="Polozka 2" Command="gsoTree_DeleteNode"/>
    
    Doufam, ze rozumite o co mi jde. Da se to nejak udelat?
    BAT
    BAT --- ---
    TENCOKACISTROMY: Ja se ty multiline nody puvodne snazil udelat podobnym zpusobem, ale porad bylo neco spatne (vetsinou dochazelo k tomu, ze se z neznameho duvodu text nody rozlozil do 3 radek) a obdelnik vyberu byl vuci "bounding boxu" nody posunuty do leva o -3px a dalsi drobne opticke vady... (ktere by asi sly vyresit, ale za ten cas by to asi nestalo)
    Rozhodne diky za pomoc, ale asi rovnou prejdu na WPF jak radi JACHYMKO.
    Obema moc dekuju, usetrili jste mi buh vi kolik hodin badani a googleni a pokusovani.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    JACHYMKO: Pokud maji byt vsechny stejne vysoke, tak to jde.
    private void FTreeViewSample_Load(object sender, EventArgs e) {
    	this.treeView1.DrawMode = TreeViewDrawMode.OwnerDrawText;
    	this.treeView1.DrawNode += new DrawTreeNodeEventHandler(treeView1_DrawNode);
    	this.treeView1.ItemHeight *= 2;
    
    	var node_A = this.treeView1.Nodes.Add("First node");
    	var node_A_A = node_A.Nodes.Add("First node - first child");
    	var node_A_A_A = node_A_A.Nodes.Add("First node - first child - first child");
    	var node_A_B = node_A.Nodes.Add("First node - second child");
    	var node_A_C = node_A.Nodes.Add("First node - third child");
    	var node_B = this.treeView1.Nodes.Add("Second node");
    }
    
    void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) {
    	var rectLine1 = e.Bounds;
    	rectLine1.Height /= 2;
    
    	var rectLine2 = e.Bounds;
    	rectLine2.Height /= 2;
    	rectLine2.Y += rectLine2.Height;
    
    	var textLine1 = e.Node.Text;
    	if ( null == textLine1 ){ textLine1 = string.Empty; }
    	var textLine2 = new string(textLine1.Reverse().ToArray());
    
    	var fontReqular = e.Node.NodeFont;
    	if (null == fontReqular) { fontReqular = e.Node.TreeView.Font; }
    
    	using (var brushLine1 = new SolidBrush(Color.Red)) {
    		e.Graphics.DrawString(textLine1, fontReqular, brushLine1, rectLine1);
    	}
    	using (var fontBold = new Font(fontReqular, FontStyle.Bold)) {
    		using (var brushLine2 = new SolidBrush(Color.Green)) {
    			e.Graphics.DrawString(textLine2, fontBold, brushLine2, rectLine2);
    		}
    	}
    }
    
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    BAT, JACHYMKO: To by melo jit normalne pomoci property DrawMode a udalosti DrawNode.
    Kliknutím sem můžete změnit nastavení reklam