WPF Рисование в ячейке DataGrid
От: rminko  
Дата: 14.04.11 15:06
Оценка:
Парни,
Недавно создавал тему про ЛистВью и датаГрид. проблемы затронутые в той теме благополучно решил. но теперь новая проблемка
и что -то пока не пойму как ее победить

Есть DataGrid из двух колонок. К нему прибиндена коллекция (ObservableCollection<myType>)
myType имеет такие свойства
int a
int b
Brush brush
int Width

a и b прибиндины к колонкам. (в XAML)
brush — к свойству Background стиля. (в XAML)
необходимо что бы на фоне ячейки "a" рисовался прямоугольник шириной Width (из соотвествующего ячейки экземлпяра myType)
Пока в голову лезет только в XAML в стиле или шаблоне рисовать rectangle c привязкой к Width но как это сделать на практике никак не догоню.
Подскажите в какую сторону копать, а если кто кинет в меня примерчиком как это сделать в XAML или в коде я буду безгранично счастлив.
Re: WPF Рисование в ячейке DataGrid
От: joher  
Дата: 15.04.11 08:40
Оценка: 21 (2)
Здравствуйте, rminko, Вы писали:

R>Парни,

R>Недавно создавал тему про ЛистВью и датаГрид. проблемы затронутые в той теме благополучно решил. но теперь новая проблемка
R>и что -то пока не пойму как ее победить

R>Есть DataGrid из двух колонок. К нему прибиндена коллекция (ObservableCollection<myType>)

R>myType имеет такие свойства
R>int a
R>int b
R>Brush brush
R>int Width

R>a и b прибиндины к колонкам. (в XAML)

R>brush — к свойству Background стиля. (в XAML)
R>необходимо что бы на фоне ячейки "a" рисовался прямоугольник шириной Width (из соотвествующего ячейки экземлпяра myType)
R>Пока в голову лезет только в XAML в стиле или шаблоне рисовать rectangle c привязкой к Width но как это сделать на практике никак не догоню.
R>Подскажите в какую сторону копать, а если кто кинет в меня примерчиком как это сделать в XAML или в коде я буду безгранично счастлив.

Посмотрите в сторону DataGridTemplateColumn, там же есть и пример реализации.
Re[2]: WPF Рисование в ячейке DataGrid
От: rminko  
Дата: 15.04.11 14:30
Оценка:
Здравствуйте, joher, Вы писали:

J>Посмотрите в сторону DataGridTemplateColumn, там же есть и пример реализации.


Спасибо. буду копать
Re[2]: WPF Рисование в ячейке DataGrid
От: rminko  
Дата: 15.04.11 19:50
Оценка:
Здравствуйте, joher, Вы писали:

J>Посмотрите в сторону DataGridTemplateColumn, там же есть и пример реализации.


Посмотрел в эту сторону
получился такой шаблончик
            <DataTemplate x:Key="aTemplate">
                <Border Width="{Binding Path=width}"  Background="LightBlue" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left">
                    <TextBlock Text="{Binding Path=a}"/>
                </Border>
            </DataTemplate>

"width" и "а" — как я уже говорил — это свойства элемента коллекции прибинденной к гриду
Все устраивает кроме одного НО. Так как TextBlock является дочерним элементом для бордера, то он рисуется внутри этого бордера и если ширина бордера маленькая а текст в поле "а" длинный то он есстественно обрезается.
а мне надо бы что бы текст был дочерним для самой ячейки но под ним мог рисоваться бордер или rectangle закрашенный.
Подмогните малек. как бы такую конструкцию сообразить
Re[3]: WPF Рисование в ячейке DataGrid
От: vit_as Россия  
Дата: 16.04.11 11:09
Оценка: 3 (1)
Здравствуйте, rminko, Вы писали:


R>Посмотрел в эту сторону

R>получился такой шаблончик
R>
R>            <DataTemplate x:Key="aTemplate">
R>                <Border Width="{Binding Path=width}"  Background="LightBlue" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left">
R>                    <TextBlock Text="{Binding Path=a}"/>
R>                </Border>
R>            </DataTemplate>
R>

R>"width" и "а" — как я уже говорил — это свойства элемента коллекции прибинденной к гриду
R>Все устраивает кроме одного НО. Так как TextBlock является дочерним элементом для бордера, то он рисуется внутри этого бордера и если ширина бордера маленькая а текст в поле "а" длинный то он есстественно обрезается.
R>а мне надо бы что бы текст был дочерним для самой ячейки но под ним мог рисоваться бордер или rectangle закрашенный.
R>Подмогните малек. как бы такую конструкцию сообразить

            <DataTemplate x:Key="aTemplate">
              <Grid>
                <Border Width="{Binding Path=width}"  Background="LightBlue" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left">
                   
                </Border>
                <TextBlock Text="{Binding Path=a}"/>
              </Grid>
            </DataTemplate>
Re[4]: WPF Рисование в ячейке DataGrid
От: rminko  
Дата: 16.04.11 19:07
Оценка:
Здравствуйте, vit_as, Вы писали:

_>
_>            <DataTemplate x:Key="aTemplate">
_>              <Grid>
_>                <Border Width="{Binding Path=width}"  Background="LightBlue" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left">
                   
_>                </Border>
_>                <TextBlock Text="{Binding Path=a}"/>
_>              </Grid>
_>            </DataTemplate>
_>


перед тем как написать пробовал так только без блока <Grid>. Все отлично работает спасибо. Есть только один ньюянс в реале я использую в объекте <border> свойство BorderThickness="0" и если поле width = 0 то как и ожидается никакого треугольника я не увижу. Конкретно в этой задаче меня вполне устраивает такое решение, но что если бы мне было необходимо рисовать c BorderThickness="1" то даже при width=0 я все равно увижу вертикальную палочку (рамку вокруг пряиоугольника нулевой ширины), как в таком случае реализовать? сделать два разных шаблона и щелкать их по тригеру? есть еще какие-нить варианты?
Re[5]: WPF Рисование в ячейке DataGrid
От: joher  
Дата: 18.04.11 07:16
Оценка:
Здравствуйте, rminko, Вы писали:

R>Здравствуйте, vit_as, Вы писали:


_>>
_>>            <DataTemplate x:Key="aTemplate">
_>>              <Grid>
_>>                <Border Width="{Binding Path=width}"  Background="LightBlue" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left">
                   
_>>                </Border>
_>>                <TextBlock Text="{Binding Path=a}"/>
_>>              </Grid>
_>>            </DataTemplate>
_>>


R>перед тем как написать пробовал так только без блока <Grid>. Все отлично работает спасибо. Есть только один ньюянс в реале я использую в объекте <border> свойство BorderThickness="0" и если поле width = 0 то как и ожидается никакого треугольника я не увижу. Конкретно в этой задаче меня вполне устраивает такое решение, но что если бы мне было необходимо рисовать c BorderThickness="1" то даже при width=0 я все равно увижу вертикальную палочку (рамку вокруг пряиоугольника нулевой ширины), как в таком случае реализовать? сделать два разных шаблона и щелкать их по тригеру? есть еще какие-нить варианты?


Для установки значения бордера можно пойти двумя путями, первое это, как Вы уже написали, триггер, а второе — конвертер для Binding. В обоих случаях изменения можно написать по крайней мере для 2х свойств: Visibility, BorderThickness.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.