Проблема масштабирования WPF Datagrid - PullRequest
2 голосов
/ 21 марта 2009

Я работаю с WPF DataGrid из WPFToolkit, и у меня возникают проблемы с попыткой масштабирования всей сетки данных. Первоначально я думал, что это будет действительно легко, и я просто применю масштабное преобразование к сетке и анимирую свойства ScaleX, ScaleY, когда пользователь нажимает кнопку. Однако это не сработало, потому что полоса прокрутки была увеличена при увеличении. Мне нужны фиксированные заголовки и фиксированные столбцы в сетке данных, поэтому я не могу просто использовать средство просмотра прокрутки за пределами сетки данных для обработки прокрутки. Второе, что я попробовал, это просто масштабировать размер шрифта в сетке, но это не удалось, потому что при уменьшении размера шрифта столбцы остаются на исходной ширине и не сжимаются.

Наконец-то я подумал, что у меня это работает, используя приведенный ниже код, который входит в дерево представления для сетки данных и добавляет масштабное преобразование в Scroll Content Presenter. (Также не показано в этом коде, я применяю преобразование к элементу визуального дерева для заголовков таким же образом, чтобы он также масштабировался). Я думал, что это прекрасно работает, пока не проверил горизонтальную прокрутку после масштабирования. (Вертикальная прокрутка работает отлично.) Перед масштабированием у всех нормально горизонтальная прокрутка, но после масштабирования, когда я прокручиваю horzonitally, дисплей выходит из строя. Трудно точно сказать, что он делает, но похоже, что контент, который прокручивается с левой стороны экрана, «сворачивается» и возвращается обратно слева. Может быть, это просто все разбить на левой стороне. У кого-нибудь есть идеи, как я могу заставить это работать, надеюсь, не выбрасывая всю свою сетку данных, которая уже работает достаточно хорошо в противном случае.

 ScrollContentPresenter sp = (ScrollContentPresenter)
VisualTreeHelper.GetChild(
VisualTreeHelper.GetChild(
VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(dgMatrix,     0), 0), 0),2);
ScaleTransform st = new ScaleTransform(1, 1);
sp.LayoutTransform = st;
DoubleAnimation a = new DoubleAnimation();
a.By = 1.5;
a.AutoReverse = false;
a.Duration = new Duration(TimeSpan.Parse("0:0:0.25"));
st.BeginAnimation(ScaleTransform.ScaleXProperty, a);
st.BeginAnimation(ScaleTransform.ScaleYProperty, a);

1 Ответ

0 голосов
/ 06 мая 2010

Я нашел решение. Не знаю, так ли это, как ты это сделал или нет:

<toolkit:DataGrid.CellStyle>
    <Style TargetType="{x:Type toolkit:DataGridCell}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type toolkit:DataGridCell}">
                    <ContentPresenter>
                        <ContentPresenter.LayoutTransform>
                            <ScaleTransform ScaleX="{Binding Path=Value, ElementName=ZoomFactor}"
                                            ScaleY="{Binding Path=Value, ElementName=ZoomFactor}" />
                         </ContentPresenter.LayoutTransform>
                     </ContentPresenter>
                 </ControlTemplate>
             </Setter.Value>
         </Setter>
     </Style>
 </toolkit:DataGrid.CellStyle>

Где ZoomFactor - это слайдер:

<Slider x:Name="ZoomFactor"
        Value="1"
        Minimum=".25"
        Maximum="5"
        Width="180" Margin="0,0,5,0"/>
...