C# — FlatAppearance


C #: Ни в коем случае не менять настройки FlatAppearance на кнопки при использовании Control.Add (новая кнопка ())

Я в настоящее время пытаюсь изменить FlatAppearance.BorderSize, при создании кнопки с помощью Control.Add (новая кнопка ()) метод, но при использовании:

он просто возвращает ошибку, говоря, что FlatAppearance не существует. Кнопки создаются один за другим листинг информации о песнях. Каждая секция создается кнопка с помощью кнопки в FlowLayoutPanel. Есть ли работа вокруг для удаления границы на кнопку?

это повторяет для каждого столбца в форме. Большое спасибо — Росс

Вам потребуется несколько более искаженными скобки:

C#: No way to change FlatAppearance Settings on buttons when using Control.Add(new Button())

March 2020

113 time

I’m currently trying to change FlatAppearance.BorderSize, when creating a button via Control.Add(new Button()) method but when using:

it just returns an error saying that FlatAppearance does not exist. The buttons are created one after another listing information about songs. Each Section is created button by button in a FlowLayoutPanel. Is there any work around for removing the border on the button?

this then repeats for every column in the Form. Many thanks — Ross

1 answers

You will need a couple more squiggly brackets:

C#: Никакой способ изменить Настройки FlatAppearance на кнопках, используя Контроль. Добавьте (новая Кнопка ())

Я в настоящее время пытаюсь изменить FlatAppearance. BorderSize, создавая кнопку через Контроль. Добавьте (новая Кнопка ()) метод, но используя:

это просто возвращает ошибку при высказывании, что FlatAppearance не существует. Кнопки создаются, один за другим перечисляя информацию о песнях. Каждый Раздел — созданная кнопка кнопкой в FlowLayoutPanel. Есть ли какая-либо работа вокруг для удаления границы на кнопке?

это тогда повторяется для каждой колонки в Форме. Большое спасибо — Росс


C#: Невозможно изменить настройки FlatAppearance на кнопках при использовании Control.Add (новая кнопка())

В настоящее время я пытаюсь изменить FlatAppearance.BorderSize при создании кнопки с помощью элемента управления Control.Add (new Button()) но при использовании:

он просто возвращает ошибку, говоря, что FlatAppearance не существует. Кнопки создаются один за другим, перечисляя информацию о песнях. Каждый раздел создается кнопкой кнопкой в ​​FlowLayoutPanel. Есть ли какая-нибудь работа для удаления границы на кнопке?

это повторяется для каждого столбца формы. Большое спасибо — Росс

Создан 27 окт. 16 2020-10-27 16:33:55 Ross Underhill

Динамическая компоновка формы

Проблема с размещением элементов управления

Визуальные средства проектирования формы (режим Designer ) хороши тем, что программисту не нужно вычислять местоположение и размер элементов управления в пределах клиентской области формы. Он это делает визуально. Но в то же время мы не знаем, на каких компьютерах и при каких условиях будет работать наше приложение . Это зависит от следующих факторов:

  • Приложение может работать на разных языках и тексты могут выступать за границы элементов управления и формы
  • На мониторах может быть установлено разное разрешение
  • Разные версии операционной системы могут по разному отображать элементы управления

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

Свойство AutoSize

Все элементы управления , включая форму, являются наследниками класса Control, в котором имеется булево свойство AutoSize. По умолчанию значение этого свойства равно false, но если изменить его на true, то элемент управления сам будет менять свои размеры в зависимости от содержимого. Следующие элементы имеют дополнительное уточняющее свойство AutoSizeMode:


  • System.Windows.Forms.Button.AutoSizeMode
  • System.Windows.Forms.DataGridViewColumn.AutoSizeMode
  • System.Windows.Forms.Form.AutoSizeMode
  • System.Windows.Forms. GroupBox .AutoSizeMode
  • System.Windows.Forms.Panel.AutoSizeMode
  • System.Windows.Forms. UserControl .AutoSizeMode

Это свойство ожидает одно из значений одноименного перечисления

  • System.Windows.Forms.AutoSizeMode.GrowAndShrink — растягиваться и сжиматься
  • System.Windows.Forms.AutoSizeMode.GrowOnly (по умолчанию) — только растягиваться

Пример размещения одной кнопки

В следующем примере на форме размещается одна кнопка, внутри которой имеется многострочный текст. Настройка свойств кнопки и самой формы дает им возможность подстраиваться под размеры своего содержимого: кнопка подстраивается под размер текста, форма подстраивается под размер кнопки.

C# Winform Button, make the border thicker and different color?

I have a Button that when clicked I would like to change the color of the button as well as the thickness of the border. Is that possible?

Premium Content


Premium Content
  • Facebook
  • Twitter
  • LinkedIn
  • https://www.experts-exchange.com/questions/28976870/C-Winform-Button-make-the-border-thicker-and-different-color.html copy

You would still need to draw the border and text to make it look right.

We would simply subscribe to the click event. But also realize that the button border color and size are only shown when the button style is flat; e.g. —

Produces the following output —
Initial load — After clicking the button — And again —
-saige-

IT issues often require a personalized solution. With Ask the Experts™ , submit your questions to our certified professionals and receive unlimited, customized solutions that work for you.

Цукерберг рекомендует:  Программа - Помощь с C++

WPF layout: Measure и Arrange

Общее представление о том, что такое WPF Layout System, можно получить из msdn (1, 2). Там написано, что элементы управления образуют Visual-дерево, что каждый из элементов управления имеет свой определенный прямоугольник, в рамках которого он отрисовывается, что определение этих прямоугольников возлагается на Layout System и выполняется в 2 этапа (measure и arrange) и что WPF — это retained mode graphic system, в отличие от обычных Immediate и в чем преимущества такого подхода.

Однако при чтении msdn возникает ряд вопросов, на которые в документации ответов нет, и можно только догадываться о том, что происходит. Например — что произойдет, если какой-либо дочерний контрол в measure-стадии запросит для себя размер, превышающий переданный ему availableSize? Или — как при необходимости реализовать методы MeasureOverride и ArrangeOverride правильно, чтобы написанный код не противоречил принятым соглашениям о том, как должны выполняться этапы Measure и Arrange ? Влияет ли результат, полученный на этапе Measure, на этап Arrange и отрисовку, или же на отрисовку влияет только вызов Arrange, а Measure — чисто информационный этап?

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

Retained mode system


Для начала вспомним, что такое retained mode graphic system, коей является WPF. Это просто подход к прорисовке графики, при котором ответственность за определение областей, требующих перерисовки и выполнение этой перерисовки передается графической системе. То есть именно WPF является ответственной за то, чтобы каждое окно и контрол при необходимости были перерисованы. Программист уже не парится по поводу обработки событий типа WM_PAINT, как это было в Win32 API и WindowsForms, а просто задает при необходимости способ отрисовки для контрола, а WPF сама определит, когда и какой кусочек нужно ревалидировать. Программно это выглядит следующим образом: вместо того, чтобы каждый раз по приходу сообщения WM_PAINT определять регионы, которые нужно перерисовать, и выполнять эту процедуру, программист единожды указывает последовательность команд, необходимых для прорисовки контрола. Это делается в методе OnRender. Метод OnRender вызывается системой WPF:

  • Eсли еще неизвестно, как отрисовывать этот контрол
  • Eсли изменилось какое-то DependencyProperty с флагом FrameworkPropertyMetadataOptions.AffectsRender (например, Button.Content) или с другими флагами, которые неявно приводят к AffectsRender
  • Eсли контрол был явно помечен для ревалидации (вызовом InvalidateMeasure, InvalidateArrange или InvalidateVisual)

Метод OnRender вызывается с аргументом DrawingContext, у которого мы дергаем якобы отрисовывающие методы типа DrawEllipse итд. Якобы — потому, что на самом деле отрисовки не происходит, а все наши вызовы складываются в очередь команд, и будут использованы тогда, когда WPF решит, что контрол нужно перерисовать.

Собственно здесь лежит ответ на частый вопрос — вот допустим у нас есть кнопка, на которой что-то написано, мы меняем текст этой кнопки — но в какой момент и как она определяет, что нужно перепозиционировать себя и перерисовать? Ведь мы только поменяли значение свойства. А происходит следующее: текст кнопки влияет на рендеринг, и помечен соответствующим флагом, поэтому изменение значения этого свойства приводит к тому, что кнопка помечается как «грязная», то есть та, которая требует перерисовки. И вскоре после этого WPF выполнит обновление рендеринга для неё. Это случится не сразу, а только тогда, когда у WPF будет время для этого. То есть если сразу после замены получить RenderSize, то оно не изменится. Но если вызвать принудительное обновление разметки методом UpdateLayout(), то RenderSize станет тем, который соответствует измененному тексту. Собственно с этим механизмом, кстати, связан и приоритет Dispatcher.Invoke — среди доступных приоритетов есть Priority.Render, что означает, что при вызове делегата с этим приоритетом он будет исполняться наравне с процедурами, выполняемыми для рендеринга элементов.

Measuring

Почему это так важно? Потому что этапы Measure и Arrange, в рамках которых происходит позиционирование элементов, работают аналогичным образом. Они вызываются однократно, и у контрола выставляются флаги MeasureIsValid и ArrangeIsValid. После этого вызовы Measure и Arrange возвращают управление сразу, ничего не делая. Для того, чтобы заставить контрол пересчитать эти вещи, нужно опять же либо изменить какое-то DependencyProperty с флагом AffectsMeasure/AffectsArrange, либо явно сбросить флаги вызовом InvalidateMeasure/InvalidateArrange. Документация также говорит о том, что ревалидация Measure автоматом влечет за собой ревалидацию Arrange, впрочем, это и так достаточно очевидно. В общем, первый вывод таков: если в вашем контроле есть некое свойство, которое при изменении может изменить размеры и/или размещение дочерних контролов, то вы должны сделать его DependencyProperty и поставить флаг AffectsMeasure/AffectsArrange. Если же не всякое изменение значения этого свойства проводит к необходимости ревалидации контрола, то лучше этого не делать, а сделать DependencyProperty с заданным valueChangedCallback, в котором при необходимости вызывать InvalidateMeasure/InvalidateArrange вручную, чтобы не нагружать WPF излишней работой.

Теперь рассмотрим эти два метода с точки зрения программного дизайна. То есть — каковы их зоны ответственности и входные/выходные данные. Это, наверное, самое важное в понимании того, как работает WPF Layout System. Мне лично потребовалось немало времени для того, чтобы вкурить в эту тему. Пришлось даже покопаться в исходниках WPF, благо они доступны.

Measure и Arrange

Документация к Measure написана таким образом, что создается впечатление, будто бы это чисто информационный этап, и на отображение влиять не должен. Вроде бы все логично — родительский контрол опрашивает дочерние, узнает у них, сколько они хотели бы занимать места, ну и решает конкретно кому сколько пространства отрезать, и вызывает Arrange. В общем-то, на уровне PresentationCore так оно и есть (там UIElement содержит пустые виртуальные методы MeasureCore и ArrangeCore), но нас скорее всего интересует более конкретное поведение, поведение FrameworkElement и его наследников, а FrameworkElement определен у нас уже в сборке PresentationFramework.

Цукерберг рекомендует:  Как браузеры отображают рамки разного типа

Постараюсь сформулировать настолько четко и корректно, насколько смогу это сделать. Если будут неточности и ошибки, поправляйте, внесу изменения.

public void Measure(Size availableSize) — метод, который по заданному availableSize определяет желаемые размеры и выставляет их в this.DesiredSize. В описании к методу написано, что результирующий DesiredSize может быть > availableSize, но для наследников FrameworkElement это не так.
Суть метода Measure — сделать следующие вещи:

  1. Вызвать рекурсивно Measure для всех VisualChild-элементов (в противном случае флаг IsMeasureVal строго говоря неверна в контексте FrameworkElement.

Второй пункт очень важен. Действительно, в Measure-фазе и происходит подготовка к рисованию. Например, листбокс при вызове Measure, если понимает, что не помещается в размеры, определяет, что появится скроллбар. И при вызове Arrange с бОльшими размерами скроллбар все равно останется. А если наоборот, Measure был выполнен с PositiveInfinity, а Arrange — с реальными размерами, все что выйдет за пределы arrangeRect — просто обрежется.

Кстати а почему именно FrameworkElement ? На нем свет сошелся? Оказывается, действительно сошелся, и FrameworkElement переопределяет UIElement.MeasureCore и UIElement.ArrangeCore с модификатором sealed, то есть все наследники FrameworkElement (все контролы, окна итд) уже при всем желании поведение MeasureCore и ArrangeCore поменять не смогут. Они смогут только оставлять пожелания — для этого и сделаны методы MeasureOverride и ArrangeOverride. И вот в MeasureOverride availableSize действительно является soft constraint, и можно вполне легально вернуть значение, превышающее значение аргумента.

public void Arrange(Rect finalRect) — просто указывает контролу его место (x, y) и размеры прямоугольника. Все, что выйдет за эти пределы — будет обрезано.

Между Measure и Arrange существует следующая взаимосвязь — в идеале последний вызов Measure должен принимать Size, совпадающий с размером при последующем вызове Arrange. Если это так, то контрол будет отрисован идеально. Если же условие не выполняется, то возможны проблемы. То есть возможно, что все отрисуется корректно, а может быть и не совсем. Например, листбокс в этой ситуации (когда arrangeSize protected virtual Size ArrangeOverride(Size finalSize) — а здесь мы просто вызываем для каждого дочернего элемента метод Arrange с соответствующими границами и положением.

Заметьте — в MeasureOverr >
Что происходит? А происходит вот что.


Если вызывается FrameworkElement.Measure с небесконечными констрейнтами, то вне зависимости от того, что вернет наш MeasureOverr >
В противном случае было бы так, что ячейки грида с конкретными значениями width/height разъезжались бы на контролах, возвращающих DesiredSize > availableSize. А так получается что FrameworkElement сохраняет у себя реальные требования к DesiredSize, а когда приходит время Arrange, вызывает наш метод ArrangeOverride с тем значением DesiredSize, которое мы вернули в MeasureOverride. И мы в ArrangeOverride располагаем дочерние элементы так, как мы хотим.
После этого FrameworkElement.ArrangeCore, в контексте которого вызывается наш ArrangeOverride, выполняет клипинг нашего содержимого, и мы видим в гриде часть нашего контрола. А какую именно часть — зависит от свойств Horizontal/VerticalAlignment и др. Но контент виртуально прорисован целиком так как мы хотели — потому что DesiredSize наш был сохранен и передан в ArrangeOverride.

И нам при реализации наследников FrameworkElement не надо париться насчет клипинга в таких ситуациях — он все сделает за нас. А если нам нужна панель, которая обрабатывает DesiredSize > availableSize, то мы либо что-то неправильно делаем, либо нам придется спускаться на уровень ниже к UIElement‘у, который не финализирует (seal) MeasureCore и ArrangeCore.

Для проверки всего этого можно создать наследника Button и возвращать в MeasureOverride фиксированный размер, а кнопку поместить в ячейку грида с меньшими размерами (скажем, 50х50). Кнопка будет обрезана.

protected override Size MeasureOverride(Size constraint) <
return new Size(80, 80);
>

В завершение хотелось бы привести код к некоторым методам из исходников WPF (классы UIElement и FrameworkElement), относящимся к рассмотренному материалу. Куски с комментариями, достаточно подробно излагающими суть.

Целиком же исходники WPF можно скачать отсюда (качать .Net — 4).

UPD: afsherman подсказывает, что исходники WPF качать необязательно. У кого установлен ReSharper могут воспользоваться встроенной в него опцией загрузки исходников по Ctrl+Click на имени класса/метода/свойства и т.д.

One more step

Please complete the security check to access www.dreamincode.net

Why do I have to complete a CAPTCHA?

Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.

What can I do to prevent this in the future?

If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.

If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.

Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.

Cloudflare Ray ID: 53539b3d9f0e4f06 • Your IP : 188.64.174.135 • Performance & security by Cloudflare

стили Как установить/изменить/удалить стиль фокусировки на кнопке в C#?


удалить style jquery (10)

У меня есть несколько кнопок, которые я изменил, как они выглядят. Я установил их как плоские кнопки с фоном и пользовательской границей, чтобы они выглядели все красиво и ничего больше, как обычные кнопки (на самом деле они теперь выглядят как кнопки Office 2003 ;-). Кнопки имеют границу одного пикселя.

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

Цукерберг рекомендует:  7 техник для упрощения и разгрузки интерфейса вашего сайта

В сети этот вопрос задают очень часто, как «Как отключить фокус на кнопке», но это не то, что я хочу: фокус должен все еще существовать , просто не отображаться так, как сейчас.

Вы также можете создать невидимую кнопку и активировать ее при каждом нажатии другой кнопки.

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

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

Мне повезло, просто установив свойство Focusable кнопки в false:

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

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

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

Создайте пользовательскую кнопку:

Это избавится от этой досадной границы! ;-)

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

То, как я решил это, — установить BorderSize на 0, а затем нарисовать собственную границу в OnPaint

* Примечание: не вся кнопка, только граница

В моем случае именно так я сделал кнопку, которая имитирует ToolStripButton, где граница видна только при наведении курсора на кнопку:

Другой вариант (хотя и немного хактастичный) заключается в подключении обработчика событий к событию GotFocus кнопки. В этом обработчике событий передайте значение False методу NotifyDefault() кнопки. Так, например:

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

Вторая добавленная граница — стандартная «стандартная кнопка» Windows. Возможно, вы заметили, что если вы вставляете большинство диалоговых окон с несколькими кнопками (например, с любым окном свойств панели управления), оригинальная кнопка с двойными границами становится «нормальной», а кнопка фокусировки становится «двойной границей». «

Это не обязательно фокусируется на работе, а скорее визуальная индикация действия, предпринятого нажатием клавиши Enter.

Для меня это звучит, как будто вы не заботитесь об этой внутренней работе. Вы хотите, чтобы на дисплее не было двух границ — вполне понятно. Внутренняя работа заключается в том, чтобы объяснить, почему вы видите это поведение. Теперь . Чтобы исправить это.

Первое, что я попробую — и помните, я не подтвердил это — это взломать. Когда кнопка получает фокус (тем самым получая двойную границу), отключите свою единую границу. Вы можете получить тот эффект, который вам нужен, и это довольно просто. (Подключитесь к событию Focus. Еще лучше, подклассу Button и переопределите OnFocus, затем используйте этот подкласс для будущих кнопок.)

Однако это может привести к новым, неудобным визуальным побочным эффектам. В этом ключе — и потому, что хаки редко являются лучшим ответом — я должен «официально» рекомендовать то, что говорили другие: Custom нарисовать кнопку. Хотя код здесь может быть излишним, эта ссылка в CodeProject обсуждает, как это сделать (ссылка VB, вам нужно перевести). Вы должны в полном объеме настраивать режим, чтобы полностью избавиться от этой второй границы.

Установите для свойства зависимостей FocusVisualStyle значение null в вашем стиле, а пунктирная граница исчезнет.

Windows Presentation Foundation (WPF) предоставляет два параллельных механизма для изменения внешнего вида элемента управления, когда он получает фокус клавиатуры. Первым механизмом является использование средств определения свойств для таких свойств, как IsKeyboardFocused в стиле или шаблоне, который применяется к элементу управления. Второй механизм состоит в том, чтобы обеспечить отдельный стиль как значение свойства FocusVisualStyle; «фокусный визуальный стиль» создает отдельное визуальное дерево для рекламодателя, который опирается на вершину элемента управления, вместо того, чтобы изменять визуальное дерево элемента управления или другого элемента пользовательского интерфейса, заменив его. В этом разделе обсуждаются сценарии, в которых каждый из этих механизмов уместен.

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

C# Winform Button, make the border thicker and different color?

I have a Button that when clicked I would like to change the color of the button as well as the thickness of the border. Is that possible?

Premium Content
Premium Content
  • Facebook
  • Twitter
  • LinkedIn
  • https://www.experts-exchange.com/questions/28976870/C-Winform-Button-make-the-border-thicker-and-different-color.html copy

You would still need to draw the border and text to make it look right.

We would simply subscribe to the click event. But also realize that the button border color and size are only shown when the button style is flat; e.g. —

Produces the following output —
Initial load — After clicking the button — And again —
-saige-

IT issues often require a personalized solution. With Ask the Experts™ , submit your questions to our certified professionals and receive unlimited, customized solutions that work for you.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих