Как сделать скролл 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 позволяет показывать и скрывать определенную область содержимого.
Читайте также: