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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataGridTextColumn выделение текста, Выделение текста при ReadOnly=true 
V
    Опции темы
interv
  Дата 29.7.2013, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Необходимо в DataGridTextColumn сделать доступным выделение текста, т.е. сделать возможным выделение текста в TextBlock.
Спасибо.
PM MAIL   Вверх
dzaraev
Дата 29.7.2013, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Весьма расплывчато сформулирован вопрос. Потому что 
Цитата(interv @  29.7.2013,  08:46 Найти цитируемый пост)
сделать возможным выделение текста в TextBlock

- нельзя и не имеет смысла. И что-то мне подсказывает, что задача на самом деле в другом.
Во время редактирования текст и так можно выделить, но в это время грид генерирует  TextBox и вы работаете с ним.
Так все-таки что именно нужно?
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
interv
Дата 29.7.2013, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Еще раз: колонка стоит в ReadOnly = True, соответственно TextBox в принципе появиться не может.
Мне необходимо выделить часть текста в ячейке, Тип колонки DataGridTextColumn.

Есть свойство ElementStyle, но в нем невозможно заменить textblock на textbox.

Если бы это было возможно, то задача решалась бы применением к TextBox стиля:
Код

    <Style x:Key="OnlySelectedTextBox" TargetType="{x:Type TextBox}">
      <Setter Property="IsReadOnly" Value="True"/>
      <Setter Property="BorderThickness" Value="0"/>
      <Setter Property="TextBox.Background" Value="Transparent" />
      <Setter Property="Foreground" Value="#FF000000"/>
      <Setter Property="Padding" Value="2"/>
      <Setter Property="BorderBrush" Value="Transparent"/>
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="TextBox">
            <Grid x:Name="RootElement">
              <Border x:Name="Border" Opacity="1" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="1">
                <ScrollViewer x:Name="ContentElement" BorderThickness="0" IsTabStop="False" Padding="{TemplateBinding Padding}"/>
              </Border>
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>


Это сообщение отредактировал(а) interv - 29.7.2013, 10:16
PM MAIL   Вверх
dzaraev
Дата 29.7.2013, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Могу предложить два варианта:
1) Использовать DataGridTemplateColumn (вместо DataGridTextColumn).
Внутри свойства CellTemplate можете вставлять хоть TextBox, хоть еще один грид, что хотите:
Код

                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding  Mode=OneWay}" IsReadOnly="True" IsReadOnlyCaretVisible="True"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

Минус - придется самому управлять логикой редактирования ячеек, не будет генерироваться специального контрола для редактирования и т.п.

2) Перегрузить DataGridTextColumn и его метод GenerateElement, в котором сгенерировать TextBox только на чтение:
Код

    public class SelectableDataGridTextColumn : DataGridTextColumn
    {
        protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
            TextBox readonlyTextBox = new TextBox();
            readonlyTextBox.IsReadOnly = true;
            readonlyTextBox.IsReadOnlyCaretVisible = true;            
            BindingOperations.SetBinding(readonlyTextBox, TextBox.TextProperty, base.Binding);
            return readonlyTextBox;
        }
    }

Код

                <local:SelectableDataGridTextColumn>
                    <local:SelectableDataGridTextColumn.Binding >
                        <Binding Path="." Mode="TwoWay"/>
                    </local:SelectableDataGridTextColumn.Binding>
                </local:SelectableDataGridTextColumn>


В обоих случаях есть главный недостаток - визуальный стиль элемента будет как у TextBox конечно же. Поэтому придется сделать и установить свой стиль для TextBox.Style, чтобы сделать его похожим на TextBlock.

Это сообщение отредактировал(а) dzaraev - 29.7.2013, 11:28
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
interv
  Дата 29.7.2013, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


 




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


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

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