Определить, к какому элементу относятся полосы прокрутки - PullRequest
1 голос
/ 10 мая 2011

У меня довольно сложный макет. Это состоит из: Сетка с одним столбцом и тремя рядами. В первом ряду (из-за проблем) у меня есть экспресс-компонент для разработчиков - еще один GridControl.

Моя проблема в том, что, хотя высота этой первой строки равна Авто, вертикальная полоса прокрутки отображается, хотя для содержимого достаточно места.

Я попытался установить ScrollViewer.VerticalScrollBarVisibility = "Hidden" в определении строки, но это не помогает.

Аналогично, я установил внутренний GridControl так, чтобы он не использовал полосы прокрутки (используя некоторую магию Developer Express - не только ScrollViewer, поскольку это не работает)

Тем не менее, независимо от того, что я делаю, появляется эта проклятая полоса прокрутки ... Есть ли способ выяснить, какой элемент управления отображает ее, чтобы я мог отключить эту проклятую вещь? Дело не только в том, что это уродливо - прокрутка на самом деле портит макет!

Заранее спасибо!

Соответствующий код:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" ScrollViewer.VerticalScrollBarVisibility="Hidden" />
        <RowDefinition Height="*" MaxHeight="240" />
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <dxg:GridControl Name="StudySizeGrid" Grid.Column="0" Grid.Row="0" >
        <dxg:GridControl.Resources>
            <ControlTemplate x:Key="{dxgt:TableViewThemeKey ResourceKey=ControlTemplate}">
                <ScrollViewer x:Name="scr" 
          VerticalScrollBarVisibility="Disabled" 
          HorizontalScrollBarVisibility="Disabled"
          Focusable="False"
          dxg:GridControl.CurrentView="{Binding RelativeSource={RelativeSource TemplatedParent}}"
          Template="{DynamicResource {dxgt:TableViewThemeKey ResourceKey=ScrollViewerTemplate}}">
                    <ScrollViewer.CanContentScroll>False</ScrollViewer.CanContentScroll>
                </ScrollViewer>
            </ControlTemplate>
        </dxg:GridControl.Resources>
...
</dxg:GridControl>

РЕДАКТИРОВАТЬ ДЛЯ УТОЧНЕНИЯ: Это проблема WPF: -)

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Вы можете попробовать проверить VisualTree, я думаю, что Snoop может быть полезным для этого, возможно, у него есть и другие полезные функции.Получение VisualTree - тривиальный вопрос, однако вы можете написать один рекурсивный метод, используя VisualTreeHelper, так что вам могут не понадобиться большие пушки.

например

public static TreeViewItem GetVisualTree(this DependencyObject dpo)
{
    TreeViewItem item = new TreeViewItem();
    item.Header = dpo.GetType().ToString().Split('.').Last();
    if (dpo is FrameworkElement && (dpo as FrameworkElement).Name != string.Empty) item.Header += " (" + (dpo as FrameworkElement).Name + ")";
    int cCount = VisualTreeHelper.GetChildrenCount(dpo);
    for (int i = 0; i < cCount; i++)
    {
        item.Items.Add(VisualTreeHelper.GetChild(dpo, i).GetVisualTree());
    }
    return item;
}

Написал это довольноНекоторое время назад он был очень схематичным (не рекомендовал бы делать это методом расширения), получал бы целое дерево за один раз, мог быть изменен так, чтобы получать только дочерние элементы при расширении узла.

0 голосов
/ 10 мая 2011

Вы можете использовать что-то вроде инструментов Google Chrome.

Я бы в Chrome щелкнул правой кнопкой мыши область, в которой есть полосы прокрутки, и выбрал бы «Проверка элемента». Chrome выделит рамкой, на какой элемент вы смотрите. Затем вы можете перемещаться по HTML в инспекторе Google Chrome, пока он не выделит элемент с помощью полосы прокрутки.

Тогда вы сможете найти причину.

...