IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Maros2470
Člen
Avatar
Maros2470:5.1.2018 16:48

Zdravím.

Snažím se svázat string z databáze s RichTextBoxem.

Pro načtení textu z RichTextBox mám tento kód:

private FlowDocument _rtfDocument;
        public FlowDocument RtfDocument
        {
            get
            {
                return _rtfDocument;
            }
            set
            {
                _rtfDocument = value; NotifyPropertyChanged("Document");
            }
        }

        private string _rtfString;
        public string RtfString
        {
            get
            {
                return _rtfString;
            }
            set
            {
                _rtfString = value; NotifyPropertyChanged("RtfString");
            }
        }

        public object SelectRecipe
        {
            set
            {
                dynamic selectedValue = value;

                object val = selectedValue;
                SelectedRecipe = val as Recipe;

                if (value is Recipe)
                {
                    var a = value as Recipe;
                    SelectedRecipe.Uid = a.Uid;
                    RecipeId = a.Uid;
                    SelectedImage = Images.Where(o => o.RecipeId == RecipeId).First();

                    var doc = RtfDocument;
                    var range = new TextRange(doc.ContentStart, doc.ContentEnd);
                    var ms = new MemoryStream();
                    var sw = new StreamWriter(ms);
                    sw.Write(SelectedRecipe.RecipeText);
                    sw.Flush();
                    ms.Seek(0, SeekOrigin.Begin);
                    range.Load(ms, DataFormats.Rtf);


                }
            }
        }

Pro ukládání do databáze tento kód:

public void SaveRecipe()
        {
            if (SelectedRecipe != null)
            {
                var range = new TextRange(RtfDocument.ContentStart, RtfDocument.ContentEnd);
                var ms = new MemoryStream();
                range.Save(ms, DataFormats.Rtf);
                ms.Seek(0, SeekOrigin.Begin);
                SelectedRecipe.RecipeText = RtfString;
            }
            Save();
            RefreshRecipeForList();
        }

xaml:

<RichTextBox Grid.Row="0" Grid.RowSpan="2" ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="5" MinHeight="300">
                <FlowDocument>
                    <Paragraph>
                        <Run  Text="{Binding RtfDocument}"/>
                    </Paragraph>
                </FlowDocument>
            </RichTextBox>

Bohužel, ale bez výsledku. Můžete mi někdo poradit v čem dělám chybu?

Díky za rady.

 
Odpovědět
5.1.2018 16:48
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:5.1.2018 18:32

DataContext je nastavený?
Kde přesně to zkolabuje?

 
Nahoru Odpovědět
5.1.2018 18:32
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:5.1.2018 18:46

Trochu jsem to předělal a data mi to ukládá, problém je v načítání z databáze.

 
Nahoru Odpovědět
5.1.2018 18:46
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:5.1.2018 19:32

Nevím jestli je to uložené správně. Výsledek v databázi vypadá takto:

{\rtf1\ansi\an­sicpg1252\uc1\h­tmautsp\deff2{\fon­ttbl{\f0\fchar­set0 Times New Roman;}{\f2\fc­harset0 Georgia;}}{\co­lortbl\red0\gre­en0\blue0;\red255\g­reen255\blue255;}\loch\­hich\dbch\par­d\plain\ltrpar\i­tap0{\lang1033\fs24\f­2\cf0 \cf0\qj{\f2 {\ltrch 123456}\li0\r­i0\sa0\sb0\fi0\qj\par}
}
}

 
Nahoru Odpovědět
5.1.2018 19:32
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Maros2470
ostrozan:5.1.2018 20:08

Ano to je rtf
Když ho ale chceš zobrazit - musíš zas v něčem, co to umí - RichTextBox, FlowDocumentViewer apod
"tady ":http://www.wpf-tutorial.com/…text-editor/ je takový zajímavý příklad kde je součástí ukládání a načítání rtf souboru

 
Nahoru Odpovědět
5.1.2018 20:08
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:5.1.2018 21:20

To načítání mám takto, ale nezobrazí se nic:

FlowDocument RtfDocument = new FlowDocument();
                var range = new TextRange(RtfDocument.ContentStart, RtfDocument.ContentEnd);
                var ms = new MemoryStream();
                var sw = new StreamWriter(ms);
                sw.Write(SelectedRecipe.RecipeText);
                sw.Flush();
                ms.Seek(0, SeekOrigin.Begin);
                range.Load(ms, DataFormats.Rtf);
 
Nahoru Odpovědět
5.1.2018 21:20
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Maros2470
ostrozan:5.1.2018 21:29

Pokud dobře vidím, tak tam máš StreamWriter, tím se do souboru zapisuje - na čtení je StreamReader :)

 
Nahoru Odpovědět
5.1.2018 21:29
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:5.1.2018 21:49

Nedaří se, asi jsem úplně blbý.

 
Nahoru Odpovědět
5.1.2018 21:49
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:5.1.2018 22:58

Tak už asi nezbyde než abys dal celý kód k nahlédnutí

 
Nahoru Odpovědět
5.1.2018 22:58
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:5.1.2018 23:09

Leze na mně chřipka, tak mi to moc nemyslí. V podstatě potřebuji jen, aby se mi string SelectedRecipe­.RecipeText načetl do RichTextBoxu. V tom SelectedRecipe­.RecipeText je uložen ten Rtf string jak jsem jej posílal. Snažím se používat čisté mvvm.

 
Nahoru Odpovědět
5.1.2018 23:09
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Maros2470
ostrozan:6.1.2018 12:06

Tak teď teprve jsem si všiml, že v tom XAMLu binduješ string (Run.Text) na FlowDocument - což samozřejmě nebude fungovat

 
Nahoru Odpovědět
6.1.2018 12:06
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:6.1.2018 13:08

Já si myslel, že chyba bude v bindování. Jak bych to měl tedy nabindovat?

 
Nahoru Odpovědět
6.1.2018 13:08
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:6.1.2018 14:08

Snažil jsem se to vygooglit, ale marně.

 
Nahoru Odpovědět
6.1.2018 14:08
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Maros2470
ostrozan:6.1.2018 17:32

Hm asi to nebude nic jednoduchého - Document RichTextBoxu není DependencyProperty - jakési řešení jsem našel tady
a nebo nějak úplně jinak - já nevím, třeba v tom setteru vyvolat událost?

Editováno 6.1.2018 17:34
 
Nahoru Odpovědět
6.1.2018 17:32
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:6.1.2018 20:09

Tohle celkem chápu, jen nevím jak svázat v xamlu BindableRichTextBox s RichTextBox

 
Nahoru Odpovědět
6.1.2018 20:09
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Maros2470
ostrozan:6.1.2018 20:50

No já jsem to pochopil tak, že máš použít ten BindableRichTextBox místo originál RichTextBoxu a i ten binding bych nastavil v kódu .cs - ne v xaXAMLu

 
Nahoru Odpovědět
6.1.2018 20:50
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:6.1.2018 21:01

Už jsem se dostal dále, ale zobrazí to pouze string uložený v databázi. Rtf, nebo xaml ne. Ten převod z rtf na FlowDocument mám takto:

if (SelectedRecipe != null)
            {
                byte[] byteArray = Encoding.UTF8.GetBytes(SelectedRecipe.RecipeText);
                using (MemoryStream ms = new MemoryStream(byteArray))
                {
                    TextRange tr = new TextRange(RtfDocument.ContentStart, RtfDocument.ContentEnd);
                    tr.Load(ms, DataFormats.Rtf);
                }
            }

Binduji ten RtfDocument. SelectedRecipe­.RecipeName je rtf soubor z databáze.

xaml je takto:

<class:BindableRichTextBox Document="{Binding SelectedRecipe.RecipeText, Converter={StaticResource FlowDocumentConverter}}"  Grid.Column="0" Grid.RowSpan="2" ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="5" MinHeight="300">
                <RichTextBox.Resources>
                    <Style TargetType="{x:Type Paragraph}">
                        <Setter Property="Margin" Value="0"/>
                    </Style>
                </RichTextBox.Resources>

            </class:BindableRichTextBox>
 
Nahoru Odpovědět
6.1.2018 21:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 17 zpráv z 17.