Возможна ли постоянная прокрутка? - PullRequest
4 голосов
/ 01 марта 2011

У меня проблема при попытке найти способ сохранить ScrollBars/ScrollViewers постоянно включенным.Я работаю над приложением ввода данных, где некоторые пользователи могут иметь только права на «чтение».Для этого необходимо отключить все элементы управления, чтобы они не могли вносить какие-либо изменения.

Когда элемент управления отключен, пользователь не может просматривать всю информацию в прокручиваемых элементах управления (Infragistics XamDataGrid, DevExpress GridControl, TextBox es с Wrap, ListBox и т. Д.).Я надеялся, что смогу «перехитрить» Microsoft и реализовать Trigger, чтобы установить IsEnabled в значение true, когда для него было установлено значение false, но, конечно, это не сработало (по разным причинам, я уверен,).

На данный момент я сосредоточился исключительно на текстовом поле, чтобы попытаться отключить содержимое, но оставить включенным ScrollViewer и не повезло.

Я надеялся, что может быть решение, IE переопределяет свойство зависимостей IsEnabled ScrollViewer, чтобы всегда возвращать true, или предоставляет какой-то Style, который не учитывает ScrollViewer

Я знаю, что TextBox имеет свойство IsReadOnly, но это бесполезно для многих других элементов управления, для которых мне нужно решить эту проблему.

Isесть какой-то способ решить эту проблему довольно простым способом (простым, так как я могу создать стиль, который будет применяться везде, без изменения 200+ файлов кода).

Спасибо

РЕДАКТИРОВАТЬ: Вот код, который я использую в примере проекта, чтобы попытаться решить эту проблему.

<Window x:Class="WPFScrollViewerStyles.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <Style BasedOn="{x:Null}" TargetType="{x:Type TextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true">
                        <ScrollViewer x:Name="PART_ContentHost" HorizontalScrollBarVisibility="Visible" 
                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" IsEnabled="True" />
                    </Microsoft_Windows_Themes:ListBoxChrome>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="IsEnabled" Value="True" TargetName="PART_ContentHost" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid IsEnabled="False">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="100" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="100" />
        <RowDefinition Height="100" />
        <RowDefinition Height="100" />
    </Grid.RowDefinitions>

    <TextBox x:Name="txtScroller" Width="100" Height="100" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" ScrollViewer.CanContentScroll="True">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras faucibus hendrerit lorem, auctor vehicula sem molestie nec. Quisque non massa quam. Nullam tempor blandit tempor. Integer in molestie ipsum. Donec augue mi, auctor vitae scelerisque a, vehicula ac ipsum. Etiam posuere vulputate augue quis convallis. Nullam aliquet purus nec lacus fermentum hendrerit egestas purus tincidunt. Suspendisse quis lacinia libero. Quisque facilisis turpis at augue dignissim aliquam ultrices sem porta. Etiam sagittis arcu id nibh ultrices dictum. Nulla non lectus luctus est malesuada luctus. Praesent sed lobortis nisi. Morbi et porttitor massa. Sed pellentesque, nisl eu imperdiet varius, ligula augue cursus nisl, eu egestas metus velit non elit. Phasellus elementum hendrerit risus, eu tincidunt ante gravida vel.
    </TextBox>

    <ListBox x:Name="lstScroller" Width="100" Height="100" Grid.Column="1">
        <ListBox.Items>
            <ListBoxItem Content="Item 1" />
            <ListBoxItem Content="Item 2" />
            <ListBoxItem Content="Item 3" />
            <ListBoxItem Content="Item 4" />
            <ListBoxItem Content="Item 5" />
            <ListBoxItem Content="Item 6" />
            <ListBoxItem Content="Item 7" />
            <ListBoxItem Content="Item 8" />
            <ListBoxItem Content="Item 9" />
            <ListBoxItem Content="Item 10" />
            <ListBoxItem Content="Item 11" />
            <ListBoxItem Content="Item 12" />
            <ListBoxItem Content="Item 13" />
            <ListBoxItem Content="Item 14" />
            <ListBoxItem Content="Item 15" />
        </ListBox.Items>
    </ListBox>
</Grid>

Ответы [ 3 ]

5 голосов
/ 02 марта 2011

Благодаря Седрику Дуссуду из Microsoft я нашел решение.

Для справки: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3bf5e186-845c-4b63-acd9-17d294a30f77

Вместо подкласса элемента управления ScrollViewer, я переопределяю метаданные в событии Application_Startup приложения, например:

ScrollViewer.IsEnabledProperty.OverrideMetadata(typeof(ScrollViewer), new UIPropertyMetadata(true, new PropertyChangedCallback(ScrollViewer_IsEnabledPropertyChanged), new CoerceValueCallback(ScrollViewerForceEnabled)));

Iзатем обработайте CoerceValueCallback, чтобы всегда возвращать true, например так:

        private static void ScrollViewer_IsEnabledPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs args) { }
    private static object ScrollViewerForceEnabled(DependencyObject source, object value)
    {
        return true;
    }

Согласно Седрику, это может иметь непредвиденные последствия, но на данный момент (и мое мощное тестовое приложение с отключенной сеткой и двумя прокручиваемыми элементами управления) Я не нашел ни одного.Надеемся, что это решение поможет кому-то другому без проблем.

2 голосов
/ 23 сентября 2012

Я знаю, что это старый вопрос, но я думаю, что нашел похожее, но более простое решение, которое может помочь другим: вместо переопределения метаданных свойства для IsEnabledProperty ScrollViewer, я применил тот же самый подход, но к IsEnabledProperty ScrollBar's , Кажется, это работает нормально и не требует от меня создания и применения нового шаблона для средств просмотра прокрутки. Единственный недостаток, по-видимому, заключается в том, что команды колесика мыши и клавиатуры Page-Up / Down не работают (поскольку само средство просмотра с прокруткой все еще отключено). Код метаданных переопределения:

ScrollBar.IsEnabledProperty.OverrideMetadata(
  typeof(ScrollBar),
  new FrameworkPropertyMetadata(
  (PropertyChangedCallback) null,
  (CoerceValueCallback) AlwaysCoerceToTrue));

, а метод AlwaysCoerceToTrue:

private static object AlwaysCoerceToTrue(DependencyObject o, object value)
{
    return true;
}
0 голосов
/ 01 марта 2011

Я думаю, вы можете изменить стиль элементов пользовательского интерфейса, заставив их использовать шаблон элемента управления, который включает

<ScrollViewer HorizontalScrollBarVisibility="Visible"
              VerticalScrollBarVisibility="Visible" ... />

Например, для TextBox вы можете использовать модифицированный шаблон элемента управления по умолчанию :

<ControlTemplate TargetType="{x:Type TextBoxBase}">
    <Border Name="Border" CornerRadius="2" Padding="2" BorderThickness="1">
        ...
        <ScrollViewer Margin="0" x:Name="PART_ContentHost" 
                      HorizontalScrollBarVisibility="Visible"
                      VerticalScrollBarVisibility="Visible"/> <!-- HERE -->
    </Border>
</ControlTemplate>
...