Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RichTextBox шаблон и биндинг 
:(
    Опции темы
DenWPF
Дата 8.7.2010, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



В инете много примеров. но я как всегда их не догоняю.

так как ещё не дочитал до DEPENDENCY PROPERTY.

Я решил сделать событие и в нем ручками прописать куда что запихнуть.
но я не хочу программно каждый раз создавать RTB.

вот хочу что то подобное заполнять:

Код

<RichTextBox x:Name="content" Background="{x:Null}"  >
                        <FlowDocument>
                            <Paragraph x:Name="rtb_title">
                                
                            </Paragraph>
                            <Paragraph>
                                <Bold  x:Name="rtb_price">
                                </Bold>
                            </Paragraph>
                        </FlowDocument>
                    </RichTextBox>

а в коде писать что то проде 

Код

Paragraph para = new Paragraph();

            para.Inlines.Add(new Run("I am a flow document. Would you like to edit me? "));

            rtb_title = para;

PM MAIL   Вверх
SergeyLoginov
Дата 8.7.2010, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.9.2009
Где: Иваново

Репутация: 4
Всего: 4



В сообщении нет ни одного вопроса smile
Но сомневаюсь, что 
Код

            Paragraph para = new Paragraph();
            para.Inlines.Add(new Run("I am a flow document. Would you like to edit me? "));
            rtb_title = para;

даст желаемый результат. Скорее стоит попробовать нечто вроде:
Код

            rtb_title.Inlines.Clear();
            rtb_title.Inlines.Add(new Run("I am a flow document. Would you like to edit me? "));


А насчет привязки. Ты уж дочитай лучше про Dependency Property, про привязки и т.п. Ибо Привязки данных в wpf - очень важная и отличительная особенность. Если ее не использовать, то частично теряется смысл применения wpf.
Можно сделать нечто вроде:
Код

<RichTextBox x:Name="content" Background="{x:Null}"  DataContext={Binding ...}>
                        <FlowDocument>
                            <Paragraph>
                                <Run x:Name="rtb_title_run" Text={Binding Title}/>
                            </Paragraph>
                        </FlowDocument>
                    </RichTextBox>

Где вместо DataContext={Binding ...} задан нужный контекст данных. И в этом контексте имеется свойство Title (либо DependencyProperty, либо контекст данных реализует INotifyPropertyChanged и в сеттере свойства Title возбуждается событие PropertyChanged). Тогда, наверное, получишь то, что хочешь.

Это сообщение отредактировал(а) SergeyLoginov - 8.7.2010, 12:42
PM MAIL   Вверх
DenWPF
Дата 8.7.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



помогло
Код

 rtb_title.Inlines.Clear();
            rtb_title.Inlines.Add(new Run("I am a flow document. Would you like to edit me? "));


а вот 
Код

<RichTextBox x:Name="content" Background="{x:Null}"  DataContext={Binding ...}>
                        <FlowDocument>
                            <Paragraph>
                                <Run x:Name="rtb_title_run" Text={Binding Title}/>
                            </Paragraph>
                        </FlowDocument>
                    </RichTextBox>

не чего не дало =( сказал что надо через dependecy =(
PM MAIL   Вверх
SergeyLoginov
Дата 8.7.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.9.2009
Где: Иваново

Репутация: 4
Всего: 4



Цитата(DenWPF @ 8.7.2010,  15:03)
не чего не дало =( сказал что надо через dependecy =(

Я попробовал, у меня такой вариант проходит. Что-то ты напутал. Выложи текст ошибки и убедись, что правильно назначил контекст данных, и что в нем есть необходимое публичное свойство.
PM MAIL   Вверх
DenWPF
Дата 8.7.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Код

"Binding" нельзя задать в свойстве "Text" типа "Run". "Binding" можно задать только в параметре DependencyProperty объекта DependencyObject.

Код

<RichTextBox x:Name="content" Background="{x:Null}" DataContext="{Binding ElementName=datagrid, Path=SelectedItem}" >
                        <FlowDocument>
                            <Paragraph x:Name="rtb_title">
                                <Run x:Name="rtb_title_run" Text="{Binding Title}"/>
                            </Paragraph>
                            <Paragraph x:Name="rtb_description">

                            </Paragraph>

                        </FlowDocument>
                    </RichTextBox>


DataContext="{Binding ElementName=datagrid, Path=SelectedItem}" - проверил на Gride всё гуд.
PM MAIL   Вверх
SergeyLoginov
Дата 8.7.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.9.2009
Где: Иваново

Репутация: 4
Всего: 4



 smile 
Ничего не понимаю. У меня по крайней мере свойство Text класса System.Windows.Documents.Run является DependencyProperty и все ок. Архистранно.
PM MAIL   Вверх
Riccon
Дата 8.7.2010, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.5.2004

Репутация: нет
Всего: нет



Пробуем следующий вариант:
Код

public class MyRichTextBox : RichTextBox
    {
        private static DependencyProperty SaveAsProperty = DependencyProperty.Register("SaveAs", typeof(string), typeof(MyRichTextBox));
        private static DependencyProperty LoadedAsProperty = DependencyProperty.Register("LoadedAs", typeof(string), typeof(MyRichTextBox));
        private static DependencyProperty IsFormattedProperty = DependencyProperty.Register("IsFormatted", typeof(bool), typeof(MyRichTextBox), new PropertyMetadata(false));
        private static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MyRichTextBox));
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }
        public MyRichTextBox() : base() { }
        public MyRichTextBox(FlowDocument document) : base(document) 
        {
            IsFormatted = true;
        }
        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);
            var descriptor = DependencyPropertyDescriptor.FromProperty(TextProperty, typeof(TextBox));
            descriptor.AddValueChanged(this, delegate { if (RTBContent != Text) RTBContent = Text == null ? string.Empty : Text; });
            TextChanged += delegate { if (Text != RTBContent) Text = RTBContent; };
        }
        public bool IsFormatted
        {
            get { return (bool)GetValue(IsFormattedProperty); }
            set { SetValue(IsFormattedProperty, value); }
        }

        public string SaveAs
        {
            get { return (string)GetValue(SaveAsProperty); }
            set { SetValue(SaveAsProperty, value); }
        }

        public string LoadedAs
        {
            get { return (string)GetValue(LoadedAsProperty); }
            set { SetValue(LoadedAsProperty, value); }
        }

        public string TextOnly
        {
            get { return new TextRange(Document.ContentStart, Document.ContentEnd).Text; }
        }

        public void ClearFormatting()
        {
            RTBContent = TextOnly;
        }
        public string RTBContent
        {
            get
            {
                TextRange tr = new TextRange(Document.ContentStart, Document.ContentEnd);
                using (var ms = new MemoryStream())
                {
                    tr.Save(ms, IsFormatted ? DataFormats.Rtf : DataFormats.Text);
                    return ASCIIEncoding.Default.GetString(ms.ToArray());
                }
            }
            set
            {
                TextRange selection = new TextRange(Document.ContentStart, Document.ContentEnd);
                SetRangeContent(selection, value);

                if ((string)GetValue(TextBox.TextProperty) != value)
                    SetValue(TextBox.TextProperty, value);
            }
        }
        private string SetRangeContent(TextRange selection, string content)
        {
            string loadType = DataFormats.Rtf;
            IsFormatted = true;
            content = content == "" ? " " : content;
            try
            {
                using (MemoryStream ms = new MemoryStream(ASCIIEncoding.Default.GetBytes(content)))
                {
                    if (content.StartsWith("<Section"))
                    {
                        if (selection.CanLoad(DataFormats.Xaml))
                        {
                            selection.Load(ms, DataFormats.Xaml);
                            loadType = DataFormats.Xaml;
                        }
                    }
                    else if (content.StartsWith("PK"))
                    {
                        if (selection.CanLoad(DataFormats.XamlPackage))
                        {
                            selection.Load(ms, DataFormats.XamlPackage);
                            loadType = DataFormats.XamlPackage;
                        }
                    }
                    else if (content.StartsWith("{\\rtf"))
                    {
                        if (selection.CanLoad(DataFormats.Rtf))
                        {
                            selection.Load(ms, DataFormats.Rtf);
                            loadType = DataFormats.Rtf;
                        }
                    }
                    else
                    {
                        if (selection.CanLoad(DataFormats.Text))
                        {
                            selection.Load(ms, DataFormats.Text);
                            loadType = DataFormats.Text;
                            IsFormatted = false;
                        }
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
            return loadType;
        }
    }


Используем:
Код

<local:MyRichTextBox Text="{Binding Path=MyField}" />

PM MAIL   Вверх
DenWPF
Дата 8.7.2010, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



ДА заработало. но биндинга я не вижу.

  <local:MyRichTextBox Text="{Binding ElementName=datagrid, Path=SelectedItem}" >

просто выводит путь к классу.

если сделать SelectedItem.Title - то будет только один таитл а других не будет.
PM MAIL   Вверх
Riccon
Дата 9.7.2010, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.5.2004

Репутация: нет
Всего: нет



Странно. Выложите этот кусок кода, и xaml для него
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0731 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.