Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / После ресайза GridSplitter не восстанавливается DataGrid / 2 сообщений из 2, страница 1 из 1
22.01.2014, 17:21
    #38534681
Torre
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После ресайза GridSplitter не восстанавливается DataGrid
Всем привет! Появилась неожиданная проблема
Есть окно, в окне Grid, в центре DataGrid, колонка справа и ряд снизу заняты под GridSplitter (BottomGridSplitter и RightSideGridSplitter соответственно)
За ними размещаются UserControls. В Ribbon находятся 2 ToggleButtons, которые показывают на форме эти контролы. Все работает нормально до тех пор пока пользователь не изменит GridSplitter, тогда пространство под контролами не освобождается при нажатии кнопок управления видимостью. Анализируя проблему обнаружил, что ячейка Grid (c DataGrid) не восстанавливает свои свойства по ширине или длине (на запуске значение помечено как *). Таким образом следует как-то восстановить размер таблицы после ресайзинга GridSplitter.
Кто работал с GridSplitter, подскажите идеи
...
Рейтинг: 0 / 0
23.01.2014, 14:41
    #38535638
Torre
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После ресайза GridSplitter не восстанавливается DataGrid
Вижу, с идеями у сообщества не все гладко, поэтому пришлось самому разбираться. Анализируя проблему выяснилось, что после ресайзинга Grid меняет значения на фиксированные. Решение проблемы удалось найти с помощью анимации, DataTrigger и DependencyProperty. Остановился на последнем, написал такой лисапед, может кому пригодится:

лисапед
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
public class GridRightSideHelper : GridSplitter
    {
        private static readonly Dictionary<DependencyObject, GridLength> ValuesList = new Dictionary<DependencyObject, GridLength>();

        public static GridSplitter GetRightSideWatch(DependencyObject obj)
        {
            return (GridSplitter)obj.GetValue(RightSideWatchProperty);
        }

        public static void SetRightSideWatch(DependencyObject obj, GridSplitter value)
        {
            obj.SetValue(RightSideWatchProperty, value);
        }

        public static readonly DependencyProperty RightSideWatchProperty = DependencyProperty.RegisterAttached(
            "RightSideWatch", typeof(GridSplitter), typeof(DependencyObject), new UIPropertyMetadata(null, OnRightSideWatchChanged));

        private static void OnRightSideWatchChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            if (obj == null) return;

            if (obj is Grid)
            {
                var grid = obj as Grid;
                var gs = e.NewValue as GridSplitter;
                if (gs != null)
                {
                    gs.IsVisibleChanged += (sender, args) => UpdateGrid(grid, (bool)args.NewValue);
                }
            }
        }


        private static void UpdateGrid(Grid grid, bool newValue)
        {
            var prev = grid.ColumnDefinitions.ElementAt(0);
            var curr = grid.ColumnDefinitions.ElementAt(1);
            var next = grid.ColumnDefinitions.ElementAt(2);

            if (newValue)
            {
                ValuesList[prev] = prev.Width;
                ValuesList[curr] = curr.Width;
                ValuesList[next] = next.Width;
            }
            else
            {
                if (ValuesList.Count != 0)
                {
                    grid.ColumnDefinitions.ElementAt(0).Width = ValuesList[prev];
                    grid.ColumnDefinitions.ElementAt(1).Width = ValuesList[curr];
                    grid.ColumnDefinitions.ElementAt(2).Width = ValuesList[next];
                }
            }
        }
    }


...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / После ресайза GridSplitter не восстанавливается DataGrid / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]