Как сделать скролл wpf

Добавил пользователь Евгений Кузнецов
Обновлено: 10.09.2024

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

Как я могу сделать вертикальную полосу прокрутки, созданную автоматически для моего TextBlock , как только ее содержимое превысит его высоту?

Уточнение: я бы предпочел сделать это от дизайнера, а не напрямую писать в XAML.

Оберните его в средство просмотра прокрутки:

NOTE этот ответ применим к TextBlock (текстовому элементу, доступному только для чтения), как указано в исходном вопросе.

Если вы хотите отобразить полосы прокрутки в TextBox (редактируемом текстовом элементе), используйте прикрепленные свойства ScrollViewer :

Допустимыми значениями для этих двух свойств являются Disabled , Auto , Hidden и Visible .

теперь вы можете использовать следующее:

Что-то лучшее было бы:

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

Это способ использовать прокрутку TextBox в XAML и использовать ее в качестве текстовой области.

Я делаю это по-другому, вставляя MaxHeight в ScrollViewer.

Просто отрегулируйте MaxHeight, чтобы показать больше или меньше строк текста. Легко.

Этот ответ описывает решение с использованием MVVM.

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

Добавьте это XAML:

Добавьте это прикрепленное свойство:

И это прилагаемое свойство (чтобы очистить поле):

Затем, если вы используете фреймворк внедрения зависимостей, такой как MEF, вы можете поместить весь код, специфичный для ведения журнала, в его собственный ViewModel:

Вот как это работает:

у меня есть проблема с полосами прокрутки, появляющимися в Internet Explorer. У меня есть div, содержимое которого может быть шире самого div, так что появляется горизонтальная панель scollbar. Горизонтальная полоса прокрутки в порядке, но Internet Explorer также показывает вертикальную полосу.

Мне нужно включить вертикальный scroolbar в мой элемент управления CKEDITOR classic RT. Поэтому я использовал этот CSS .cke_show_borders < overflow-y: scroll; // вертикальная полоса прокрутки overflow-x: scroll; // горизонтальная полоса прокрутки >Но не работайте.. У кого-нибудь есть.

Вы можете использовать

Они являются вложенным свойством wpf. Для получения дополнительной информации

Я попытался заставить эти предложения работать для текстового блока, но не смог заставить их работать. Я даже пытался заставить его работать у дизайнера. (Посмотрите на Макет и разверните список, нажав стрелку вниз "V" внизу) Я попытался установить scrollviewer на Видимый , а затем на автоматический, но он все равно не работал.

В конце концов я сдался и изменил TextBlock на TextBox с набором атрибутов только для чтения , и это сработало как заклинание.

Это простое решение этого вопроса. Вертикальная прокрутка будет активирована только при переполнении текста.

Не знаю, есть ли у кого - то еще эта проблема, но упаковка моего TextBlock в ScrollViewer каким-то образом испортила мой UI-в качестве простого обходного пути я понял, что замена TextBlock на TextBox , как этот

создает TextBox , который выглядит и ведет себя как TextBlock с полосой прокрутки (и вы можете сделать все это в конструкторе).

Похожие вопросы:

Очень простой сценарий, но я потратил впустую много времени, поэтому спрашиваю здесь. У меня есть заявление wpf. A listview находится там, где вертикальная видимость полосы прокрутки включена.

В моем приложении Alfresco Share вертикальная полоса прокрутки всегда появляется, даже если на странице есть заметки. В файле css я вижу правило: overflow-y: scroll; , но отключение этого правила.

У меня есть две проблемы, связанные с ListBox/WrapPanel. Прежде всего, моя установка: В XAML у меня есть ListBox. Внутри ListBox находится WrapPanel. Программно я добавляю ListBoxItems к WrapPanel.

у меня есть проблема с полосами прокрутки, появляющимися в Internet Explorer. У меня есть div, содержимое которого может быть шире самого div, так что появляется горизонтальная панель scollbar.

Мне нужно включить вертикальный scroolbar в мой элемент управления CKEDITOR classic RT. Поэтому я использовал этот CSS .cke_show_borders < overflow-y: scroll; // вертикальная полоса прокрутки.

У меня есть вертикальная полоса прокрутки, которая отображается как не кликабельная. Вертикальная полоса прокрутки видна, но она кажется отключенной. Для текстовой области у меня есть:

У меня есть tabcontrol с textblock. Ничто из того, что я делаю, кажется, не заставляет вертикальную полосу прокрутки работать. Я пробовал это с помощью stackpanel, а затем использовал только.

Нажав среднюю кнопку мыши (ака: колесико мыши), а затем слегка перемещая мышь, пользователи могут прокручиваться в IE и большинстве приложений Windows. Поведение, по-видимому, отсутствует в элементах управления WPF по умолчанию? Есть ли настройка, обходной путь или что-то очевидное, что мне не хватает?

ОТВЕТЫ

Ответ 1

Я нашел, как достичь этого, используя 3 события мыши ( MouseDown , MouseUp , MouseMove ). Их обработчики привязаны к элементу ScrollViewer в xaml ниже:

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

Если для удаления метода вызовы AddScrollSign и RemoveScrollSign , этот пример будет работать. Но я расширил его двумя способами, которые устанавливают значок прокрутки:

Пример значков:

И последнее замечание: есть проблемы со способом Press -> Immediately Release -> Move . Предполагается отменить прокрутку, если пользователь нажимает левую кнопку мыши или любую клавишу клавиатуры, или приложение теряет фокус. Есть много событий, и у меня нет времени на их обработку.

Но стандартный способ Press -> Move -> Release работает без проблем.

Ответ 2

vorrtex разместил хорошее решение, , пожалуйста, поддержите его!

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

Вы упомянули проблемы с Press- > Release- > Move. Вы должны использовать MouseCapturing для получения MouseEvents, даже если мышь больше не находится над ScrollViewer. Я не тестировал его, но, думаю, ваше решение также терпит неудачу в Press->Move->Move outside of ScrollViewer->Release , Mousecapturing тоже позаботится об этом.

Также упоминается использование Поведения. Я предпочел бы предложить прикрепленное поведение, которое не требует дополнительных зависимостей.

Вы должны определенно не использовать дополнительный холст, но делать это у Adorner.

ScrollViewer сам содержит ScrollContentPresenter, который определяет AdornerLayer. Вы должны вставить там Adorner. Это устраняет необходимость в любой дополнительной зависимости, а также сохраняет приложенное поведение так же просто, как IsMiddleScrollable="true" .

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

Я с помощью WPF .С net 3.5 и WPF инструментарий управления DataGrid. Мой грид обновляется, когда мои изменения коллекции, прекрасно работает. Теперь, мой DataGrid является расположенный внутри нормальной сетки и полосы прокрутки появляются, если в DataGrid становится слишком большим. Также хорошо.

И сейчас идет 1.000.000 $ вопрос:

Как я могу получить DataGrid для перехода к последней строке? Есть:

  • нет свойства autoscroll
  • индекс № CurrentRowSelected
  • а CurrentCell, но нет коллекции, я мог бы использовать для CurrentCell = AllCells.Последние

Любые идеи? Я чувствую себя очень глупо, и кажется странным, что этот вопрос так сложно. Что я упускаю?

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

В WPF компоновка осуществляется с использованием различных контейнеров. Каждый контейнер обладает своей собственной логикой компоновки – некоторые укладывают элементы последовательно в строки, другие организуют их в сетку невидимых ячеек

Окно и страница в WPF может содержать только один элемент - контейнер . В контейнер можно поместить различные элементы пользовательского интерфейса и другие контейнеры. Компоновка в WPF определяется типом используемого контейнера. Контейнеры компоновки WPF– это панели, порожденные от абстрактного класса System.Windows.Controls.Panel. Для компоновки в приложениях используются следующие классы:

  • Grid и UniformGrid – размещают элементы в строки и колонки в соответствии с невидимой таблицей;
  • StackPanel – размещает элементы в горизонтальные и вертикальные стопки. Этот контейнер часто используется для организации небольших участков более крупного и сложного окна;
  • WrapPanel – размещает элементы управления в доступном пространстве, по одной строке или колонке;
  • DockPanel - размещает элементы управления относительно одного из своих внешних краев ;
  • Frame – аналогичен StackPanel, но является предпочтительным способом упаковки содержимого для переходов на страницы.

Grid является наиболее мощным контейнером в WPF. Большая часть всего, что можно сделать с помощью других контейнеров компоновки, можно выполнить в Grid. Grid является идеальным инструментом для разделения окна (страницы) на более мелкие области, которыми можно будет управлять с помощью других панелей.

Grid распределяет элементы по сетке невидимых строк и столбцов. В одну ячейку сетки целесообразно помещать один элемент, который при необходимости может быть сам другим контейнером компоновки, в котором можно создать собственную группу элементов управления.

Панель StackPanel является одним из простейших контейнеров компоновки. Данная панель укладывает свои дочерние элементы в одну строку или колонку.

Контейнер UniformGrid, в отличие от Grid, требует установки только количества строк и столбцов и формирует ячейки одинакового размера, которые занимают всё доступное пространство окна (страницы) или элемента внешнего контейнера.

WrapPanel в зависимости от свойства Orientation упорядочивает элементы управления горизонтально ( Horizontal ) или вертикально ( Vertical ), заполняя текущий размер панели. При горизонтальном расположении элементы управления могут переноситься на следующую строку, а при вертикальном – на следующий столбец.

Панель DockPanel осуществляет пристыковку элементов управления к одной из своих сторон в зависимости от значения свойства Dock, которое может принимать значения Left, Right, Top или Bottom. Так если элемент управления был пристыкован к верхней части DockPanel, то он растягивается и будет занимать всю ширину панели, принимая такую высоту, какая определена параметром MaxHeight.

Frame является элементом управления содержимым, который предоставляет возможность перехода к содержимому и его отображения. Frame можно разместить внутри другого содержимого, как и другие элементы управления и элементы. Содержимое может быть любым типом объекта . NET Framework и файлов HTML . Обычно Frame используется для упаковки содержимого определяющего переходы на страницы.

Свойства компоновки определяются контейнером, но дочерние элементы также оказывают на неё определенное влияние. Панели компоновки работают в согласии со своими дочерними элементами благодаря следующим свойствам:

  • HorizontalAlignment и VerticalAlignment – определяет, как дочерний элемент позиционируется внутри компоновки, когда имеется дополнительное пространство по горизонтали/вертикали;
  • Margin – добавляет пустое пространство вокруг элемента;
  • MinWidth и MaxWidth – устанавливает максимальные размерности для элемента;
  • Width и Height – явно устанавливает размеры элемента.

В WPF существуют контейнеры, которые располагают элементы управления в соответствии заданными координатами, заданными размерами. Это контейнеры Canvas и InkCanvas. Данные контейнеры в большей степени предназначены для визуализации графических примитивов и фигур.

Элементы управления содержимым

Элементы управления предназначены для поддержки интерактивной связи с пользователем. Они могут принимать фокус и получать входные данные от клавиатуры или мыши.

Элементы управления содержимым являются специализированным типом элементов управления, которые могут хранить некоторое содержимое – один или несколько элементов. Все элементы управления содержимым являются наследниками класса ContentControl ( рис. 2.3).

Иерархия элементов управления содержимым

Класс ContentControl наследуется от класса System.Windows.Control, который наделяет его и все дочерние классы базовыми характеристиками, которые:

  • позволяют определять содержимое внутри элемента управления;
  • позволяют определять порядок перехода с использованием клавиш табуляции;
  • поддерживают рисование фона, переднего плана и рамки;
  • поддерживают форматирование размера и шрифта текстового содержания.

Элементы управления имеют фон и передний план. Фоном, как правило, является поверхность элемента управления, а передним планом – текст. Цвет этих двух областей в WPF определяется с помощью свойств Background и Foreground. Эти свойства используют кисти – объект Brush. Это обеспечивает заливку содержимого фона и переднего плана сплошным цветом ( класс кисти SolidColorBrush ) или градиентным, например с помощью класса кисти LinearGradientBrush.

Для задания фона кнопки с помощью объекта Brush необходимо свойству Color кисти SolidColorBrush присвоить значение , например Blue – голубой.

В технологии WPF возможно применение сокращений для задания некоторых свойств. Так задание цвета фона или переднего плана можно выполнить следующим способом:

При этом синтаксический анализатор WPF автоматически создаст объекты SolidColorBrush с использованием заданных цветов, и будет применять созданные объекты для фона и переднего плана.

Если необходимо использовать другой тип кисти, например градиентный – LinearGradientBrush, то следует создавать объект кисти самостоятельно:

С помощью кисти рисуется рамка вокруг элемента управления. Это реализуется с помощью свойств BorderBrush и BorderThickness. При этом свойство BorderBrush принимает выбранную кисть, а BorderThickness – ширину рамки:

Технология WPF поддерживает прозрачность. Если на форме или странице расположить несколько элементов один поверх другого и для каждого из них задать различную степень прозрачности, то нижние элементы будут просматриваться через элементы, расположенные над ними. Это позволяет создавать многослойные анимационные объекты. Прозрачность можно задать двумя способами:

  • с помощью свойства Opacity (непрозрачность), которое может принимать значение от 0 до 1. Значение 1 соответствует полностью непрозрачному цвету, а 0 – полностью прозрачному;
  • с помощью полупрозрачного цвета через задание значения альфа-канала . Значение альфа-канала менее 255, является полупрозрачным.

Класс Control, от которого наследуются все элементы управления , определяет набор свойств, связанных со шрифтами:

  • FontFamily – имя шрифта для использования в элементе контроля;
  • FontSize – размер ширфта в единицах, не зависящих от устройства (каждая из них представляет собой 1/96 дюйма);
  • FontStyle – представляет наклон текста;
  • FontWeight – вес текста;
  • FontStretch – величина на которую растягивается или сжимается текст.

При выборе шрифта переднего фона элемента управления необходимо указать полное имя семейства шрифтов :

При задании полужирного шрифта с наклоном необходимо задать следующие свойства:

Многие элементы управления WPF являются элементами управления содержимым. Это элементы управления : Label, Button, CheckBox и RadioButton.

Метка – Label является простейшим элементом управления содержимым. Она принимает одиночную порцию содержимого, которую необходимо поместить внутри неё. Метка поддерживает мнемонические команды – клавишу быстрого доступа, передавая фокус связанному с ней элементу управления. Для поддержки этой функции используют свойство Target, которому присваивают выражение привязки. В выражении привязки необходимо указать другой элемент управления, на который будет переходить фокус при нажатии клавиши быстрого доступа.

Символ подчеркивания в тексте метки указывает на клавишу быстрого доступа. Все мнемонические команды работают при одновременном нажатии клавиши и заданной клавиши быстрого доступа. В приведенном выше коде при нажатии комбинации фокус перейдет на элемент управления TextBox с именем txtA.

В WPF определены три класса: Button, CheckBox и RadioButton, которые наследуются от класса ButtonBase.

Класс ButtonBase определяет событие Click и добавляет поддержку команд, которые позволяют подключить кнопки для высокоуровневых задач приложения. В классе ButtonBase имеется свойство ClickMode, которое определяет когда кнопка генерирует событие Click в ответ на действия мыши. Значением, используемым по умолчанию, является ClickMode.Release, которое означает, что событие будет сгенерировано как при нажатии, так и при отпускании кнопки мыши. Для ClickMode.Press – событие будет генерироваться только при нажатии кнопки мыши, ClickModeHover – когда указатель мыши будет наведен на кнопку и задержен на ней.

Класс Button добавляет два свойства, доступные для записи: IsCancel и IsDefault.

При IsCancel = true кнопка будет работать как кнопка отмены окна и если нажать кнопку , когда текущее окно находится в фокусе, то кнопка сработает.

Если IsDefault= true, то кнопка считается кнопкой по умолчанию.

Классы CheckBox и RadioButton наследуются от класса ToggleButton, который представляет кнопку, имеющую два состояния: нажата и отпущена. В классе имеются события Checked, Unchecked и Intermediate, которые генерируются при включении, выключении или переходе кнопки в неопределенное состояние.

Для кнопки CheckBox включение элемента управления означает отметку в нем флажка. Свойство IsChecked, наследуемое от класса ToggleButton, может принимать три значения: true (включено), false (выключено), null (неопределено, которое отображается в виде затененного окна, и используется для промежуточного состояния). Пример XAML -описания трех кнопок CheckBox приведен ниже.

Для кнопки RadioButton добавлено свойство GroupName, которое позволяет управлять расположением переключателей в группе. Из группы можно выбрать только один переключатель .

Контекстные окна указателя ToolTip позволяют выводить всплывающие окна, когда пользователь наводит указатель мыши на определенный элемент. Данные окна в WPF относятся к группе элементов управления содержимым и поэтому в них можно помещать любое допустимое содержимое. Для вывода контекстного окна указателя не обязательно использовать класс ToolTip. Можно воспользоваться свойством ToolTip элемента управления, например для кнопки:

Элемент управления ScrollViewer обеспечивает прокрутку содержимого и используется, в основном, для упаковки контейнеров компоновки. С помощью этого элемента можно создавать прокручивающиеся панели.

Элемент UserControl предназначен для создания пользовательских элементов контроля, в которых можно объединять нескольно элементов управления.

Элемент Windows является элементом управления содержимым и используется для создания всех окон приложения.

Элемент HeaderedContentControl наследуется от класса ContentControl. HeaderedContentControl является родительским классом для элементов управления, которые имеют кроме содержимого и область заголовка.

Элемент управления GroupBox является окном с заголовком и используется для группирования связанных элементов управления, например радиокнопок.

Элемент управления TabItem представляет страницу для класса TabControl. Данный элемент отображает вкладку, которая активна в данный момент на панели TabControl.

Элемент управления Expander позволяет показывать и скрывать определенную область содержимого.

Читайте также: