Страницы

Поиск по вопросам

Показаны сообщения с ярлыком button. Показать все сообщения
Показаны сообщения с ярлыком button. Показать все сообщения

понедельник, 30 марта 2020 г.

Как сделать кнопку 'Далее', чтобы она появлялась при определенном количестве слов?

#jquery #button


Всем привет.
Ребят, у меня вопрос, я задал размеры блоку height: 150; width: 250;
Когда человек оставляет комментарий не более 25 слов, необходимо, чтобы текст находился
только в том блоке,  а если комментарий больше 25 слов, то появляется кнопка "Читать
далее" и показывался остальной текст.  При уводе мышки, куда-нибудь этот блок должен
закрываться.

Помогите плиз, спасибо)
    


Ответы

Ответ 1



Пусть не смущает количество кода - это только для визуальной составляющей, и может быть сокращено, в соответствии с задачами. $(window).load(function() { $('.comment_wrap').each(function(index) { let $this = $(this); let $comment_over = $this.children('.comment_over'); let $comment_area = $this.children('.comment_area'); let $comment_head = $this.children('.comment_head'); function fNumberWords(oElem) { $comment_head.text('Количество слов: ' + oElem.text().split(' ').length); return oElem.text().split(' ').length } (fNumberWords($comment_area) > 25) ? $comment_over.show(): $comment_over.hide(); $comment_over.on('click', function(ev) { $this.css('height', 'auto'); $comment_over.hide(500); }); $this.on({ mouseleave: function(ev) { $this.css('height', '150px'); (fNumberWords($comment_area) > 25) ? $comment_over.show(): $comment_over.hide(); }, input: function(ev) { $this.css('height', 'auto'); $comment_over.hide(); fNumberWords($comment_area); } }); }); }); * { box-sizing: border-box; } .comment_wrap { position: relative; float: left; margin: 2px; width: 250px; height: 150px; overflow: hidden; background: #fff; border: 2px solid #fff; box-shadow: 1px 2px 4px #aaa; } .comment_head { padding: 5px; background: #ddd; border: 1px solid #ccc; } .comment_area { padding: border: 1px solid #ccc; min-height: 100%; padding: 8px; outline: none; text-align: justify; box-shadow: inset 0px 1px 8px #444; } .comment_over { position: absolute; bottom: 0; right: 0; padding: 1px 5px; cursor: pointer; background: #fff; text-shadow: 1px 2px 3px #000; box-shadow: -1px -1px 30px 15px #fff; } .comment_over:hover { text-shadow: 0px 0px 1px #000; }
Здесь, в этом блоке, количество слов больше двадцати пяти, поэтому кнопка спойлера видна. Вы можете отредактировать текст прямо в поле, проследить за изменениями и понять логику скрипта.
Читать далее
В этом блоке слов меньше, чем 25, потому кнопка спойлера не появляется. Но, всегда можно дописать нужное количество слов.
Читать далее
Количество блоков может быть любым. Их поведение будет одинаковым. Главное - сохранить разметку.
Читать далее
Лучше смотреть развернув страницу.

воскресенье, 15 марта 2020 г.

Как изменить цвет ToggleButton в Андроид?

#android #button #color


По умолчанию (по крайней мере, у меня) кнопка ToggleButton имеет тёмно-серый цвет,
индикатор включения (полоска внизу) - почти чёрный.

При нажатии на кнопку она кратковременно подсвечивается ярко-синим, индикатор становится
ярко-синим.

При изменении свойства background меняется цвет всей кнопки, включая индикатор. И
никакой подсветки при нажатии.

Вопрос: как изменить цвет кнопки, не затрагивая индикатор, и чтоб осталась цветовая
реакция на нажатие?

Ну и, если возможно, изменить цвет индикатора..
    


Ответы

Ответ 1



попробуйте так создаете файл colors.xml в папке res/values: #ff0000 #00ff00 В папке drawable, создается файл my_btn_toggle.xml: и в xml добавляем ToggleButton в виде: android:background="@drawable/my_btn_toggle источник есть вариант создать свой ToggleButton файл activity_main.xml файл res/drawable/toggle_selector.xml файл res/drawable/toggle_state_on.xml файл res/drawable/toggle_state_off.xml результат будет примерно так источник

Ответ 2



Слева - кнопка по умолчанию, справа - как нужно. Можно, конечно, нарисовать свои изображения, создать собственный элемент... Неужели нет простой возможности изменить цвет фона, не затрагивая полоску-индикатор???

воскресенье, 8 марта 2020 г.

Как перехватить кнопку “назад” браузера?

#javascript #http #button #кэширование #браузер


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

Как перехватить событие возврата на страницу, чтобы можно было ее обновить?
    


Ответы

Ответ 1



В комментариях верно написали, что ответ кроется не в перехвате события "назад" у браузера, а сохранении состояния страницы Например, пользователь может изменить тему страницы. Что бы при возвращении на эту страницу, была выбрана нужная тема, сохраним ее в localStorage const savePageState = (name, state) => { localStorage[name] = state; } const loadPageState = (name) => { return localStorage[name]; } Дальше, при нужных вам событиях, вы просто сохраняете в localStorage нужные вам данные, а при загрузке страницы (onload событие, например) выгружаете нужные данные и используете их

Ответ 2



Раз пользователь может изменить вид страницы, значит, работает javascript. В нем надо при обработке пользовательских действий подменить последний элемент в истории браузера, чтобы возврат происходил уже на указанную вами страницу (или тот же адрес, но с параметрами). Вот пример. Код скрипта: $('.portfolio_filter').each(function(){ var $this_filter = $(this); $this_filter.on('click', 'a', function(){ var project_type = $(this).data('optionValue').slice(1); var url = window.location.href; if (url.indexOf('?') >= 0) { url = url.slice(0, window.location.href.indexOf('?')); } if (project_type) { url = url + '?type=' + project_type; } // console.log('url: ' + url); window.history.replaceState(null, document.title, url); return false; }); }); При клике не кнопку на странице в историю дописывается url типа http://sws-group.zephyrlab.ru/projects/?type=commercial После просмотра проекта категории commercial возврат идет уже на url с ?type=commercial.

Ответ 3



Перехватить событие возврата на страницу не получилось, задача решена другим способом. Я добавил на стороне сервера в http-заголовок Cache-Control значения no-store, must-revalidate, как написано здесь: https://stackoverflow.com/questions/49547/how-to-control-web-page-caching-across-all-browsers Таким образом, при нажатии "Назад" страница автоматически обновляется браузером вообще без использования дополнительного кода JavaScript. Сделанные пользователем изменения при этом не теряются, т.к. они до этого были сохранены на сервере. При обновлении страницы по F5 также получаем с сервера самое последнее состояние страницы. Если бы состояние хранилось не на сервере, пришлось бы дописать немного JavaScript-кода (для работы с localStorage или куками), но history.replaceState я бы использовать не стал. Вместо хранения состояния (на стороне клиента) в history, гораздо удобнее хранить то же самое состояние в localStorage.

среда, 4 марта 2020 г.

Общие параметры

#python #button #tkinter


Можно ли задать параметры для всех Button/text/Label одной функцие, чтобы не писать
к каждой кнопке одинаковые параметры? К примеру, я создал много однотипных кнопок для
ввода данных калькулятора:

bttn1_1 = Button(root, text='MC', font='Arial 15', width=3, height=1, bd=4,
                 background='SkyBlue2', activebackground='green yellow')

    


Ответы

Ответ 1



Примерно так можно: buttons = {} for button_text in map(str, range(10)): button = Button(root, text=button_text, font='Arial 15', width=3, height=1, bd=4, background='SkyBlue2', activebackground='green yellow') buttons[button_text] = button Кнопка с текстом 1: buttons['1'] Еще можно создать функцию которая обрезает/исправляет параметры: def create_button(text): return Button(root, text=text, font='Arial 15', width=3, height=1, bd=4, background='SkyBlue2', activebackground='green yellow')

Ответ 2



Можно опции для кнопок, созданных в разных местах кода, менять, изменив соответствующий стиль: #!/usr/bin/env python3 import tkinter.ttk root = tkinter.Tk() style = tkinter.ttk.Style() for color in ['red', 'green']: tkinter.ttk.Button( text=color, command=lambda c=color: style.configure('TButton', background=c)).pack() root.mainloop() Нажимая на любую из кнопок, изменяется цвет у всех кнопок со стилем 'TButton' в данном случае. Сгруппировать кнопки по своим стилям, можно используя style параметр: Button(style='C.TButton').

пятница, 14 февраля 2020 г.

Как эмулировать нажатие на кнопку в приложении WPF C#

#c_sharp #wpf #button


Подскажите, как в приложении WPF эмулировать программно нажатие на кнопку Button
левой клавишей мыши?
Использовать button1.PerformClick() не предлагать, в WPF нет такого метода у Button.
    


Ответы

Ответ 1



Способ 1: this.button.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); Способ 2: typeof(System.Windows.Controls.Primitives.ButtonBase) .GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic) .Invoke(button, new object[0]); Пример: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void button_Click(object sender, RoutedEventArgs e) { MessageBox.Show("КНОПКА НАЖАТА"); } private void button1_Click(object sender, RoutedEventArgs e) { this.button.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); } private void button2_Click(object sender, RoutedEventArgs e) { typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]); } }

Ответ 2



В шаблоне кнопки есть элемент ButtonChrome (называется Chrome), нажатие по кнопке с помощью триггера выставляет свойство RenderPressed этого элемента в значение true. Вы можете добавить кнопке Attached Property и переопределить ее шаблон, в котором добавить еще один триггер на установку этого AP. Более простой, но менее изящный способ — наследоваться от кнопки и выставить публичный метод для ее нажатия: class MyButton : Button { public async void PressAsync() { var chrome = GetTemplateChild("Chrome") as Decorator; if (chrome == null) return; var chromeType = chrome.GetType(); var propertyInfo = chromeType.GetProperty("RenderPressed"); propertyInfo.SetValue(chrome, true); await Task.Delay(100); propertyInfo.SetValue(chrome, false); } } Я здесь использовал рефлексию, т.к. ButtonChrome может использоваться из разных сборок (зависит от ОС и от ее темы). Использование: Кодбихайнд: private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { MB.PressAsync(); } Другой, еще более костыльный способ — использовать вместо обычной кнопки переключатель ToggleButton: class MyButton : ToggleButton { protected override async void OnChecked(RoutedEventArgs e) { base.OnChecked(e); await Task.Delay(100); IsChecked = false; } } При нажатии кнопки в поле ввода просто установите ему IsChecked = true, через 0,1 с он "откинется" автоматически: private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { MB.IsChecked = true; }

Ответ 3



Есть еще вот такой способ: using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; using System.Windows.Interop; using System.IO; using System.Xml; using System.Runtime.InteropServices; using System.Threading.Tasks; namespace WpfApplication1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } /*Вспомогательные методы и константы...*/ public static Point ElementPointToScreenPoint(UIElement element, Point pointOnElement) { return element.PointToScreen(pointOnElement); } [DllImport("user32.dll")] static extern int GetSystemMetrics(int smIndex); [DllImport("user32.dll")] static extern uint SendInput(uint nInputs, [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool GetCursorPos(ref Win32Point pt); const uint MOUSEEVENTF_ABSOLUTE = 0x8000; const uint MOUSEEVENTF_MOVE = 0x0001; const uint MOUSEEVENTF_LEFTDOWN = 0x0002; const uint MOUSEEVENTF_LEFTUP = 0x0004; const int SM_CXSCREEN = 0; const int SM_CYSCREEN = 1; /* Эмулирует нажатие мышью на элемент управления */ public static async void PerformClick(Control ctrl) { double XSCALEFACTOR = 65535.0 / (GetSystemMetrics(SM_CXSCREEN) - 1); double YSCALEFACTOR = 65535.0 / (GetSystemMetrics(SM_CYSCREEN) - 1); //находим координаты центра элемента double x = ctrl.ActualWidth / 2; double y = ctrl.ActualHeight / 2; Point p = ElementPointToScreenPoint(ctrl, new Point(x, y)); //сохраняем текущие координаты мыши Win32Point mouse = new Win32Point(); GetCursorPos(ref mouse); //эмулируем нажатие INPUT[] arr = new INPUT[1]; arr[0].Type = INPUT_TYPE.INPUT_MOUSE; arr[0].Data.Mouse.ExtraInfo = IntPtr.Zero; arr[0].Data.Mouse.X = (int)Math.Round(p.X * XSCALEFACTOR); arr[0].Data.Mouse.Y = (int)Math.Round(p.Y * YSCALEFACTOR); arr[0].Data.Mouse.Flags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP; var res =SendInput(1, arr, Marshal.SizeOf(typeof(INPUT))); if(!Window.GetWindow(ctrl).IsMouseOver) await Task.Delay(1); //если мышь за пределами окна, WPF понадобится некоторое время для обработки события //возвращаем предыдущее положение мыши arr[0].Type = INPUT_TYPE.INPUT_MOUSE; arr[0].Data.Mouse.X = (int)Math.Round(mouse.X * XSCALEFACTOR); arr[0].Data.Mouse.Y = (int)Math.Round(mouse.Y * YSCALEFACTOR); arr[0].Data.Mouse.Flags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE ; res = SendInput(1, arr, Marshal.SizeOf(typeof(INPUT))); } private async void Window_Loaded(object sender, RoutedEventArgs e) { //пример использования await Task.Delay(1000); PerformClick(button1); await Task.Delay(3000); PerformClick(button2); } } //WINAPI types... enum INPUT_TYPE : uint { INPUT_MOUSE = 0, INPUT_KEYBOARD = 1, INPUT_HARDWARE = 2 } [StructLayout(LayoutKind.Sequential)] struct INPUT { public INPUT_TYPE Type; public MOUSEKEYBDHARDWAREINPUT Data; } [StructLayout(LayoutKind.Explicit)] struct MOUSEKEYBDHARDWAREINPUT { [FieldOffset(0)] public HARDWAREINPUT Hardware; [FieldOffset(0)] public KEYBDINPUT Keyboard; [FieldOffset(0)] public MOUSEINPUT Mouse; } [StructLayout(LayoutKind.Sequential)] struct HARDWAREINPUT { public uint Msg; public ushort ParamL; public ushort ParamH; } [StructLayout(LayoutKind.Sequential)] struct KEYBDINPUT { public ushort Vk; public ushort Scan; public uint Flags; public uint Time; public IntPtr ExtraInfo; } [StructLayout(LayoutKind.Sequential)] struct MOUSEINPUT { public int X; public int Y; public uint MouseData; public uint Flags; public uint Time; public IntPtr ExtraInfo; } [StructLayout(LayoutKind.Sequential)] struct Win32Point { public Int32 X; public Int32 Y; }; }

понедельник, 10 февраля 2020 г.

Как узнать какой клавишей мыши была нажата кнопка?

#c_sharp #wpf #button


Как в событии Button_Click определять, какая кнопка мыши была нажата?
    


Ответы

Ответ 1



Чтобы определить какая кнопка мыши была нажата, вы можете использовать свойство SystemParameters.SwapButtons private void Button_Click(object sender, RoutedEventArgs e) { if (SystemParameters.SwapButtons) { // Была нажата правая кнопка } else { // Была нажата левая кнопка } } Но учтите, это событие вызывается только при нажатии основной кнопки. Об этом сказано по ссылке на английский SO в одном из ответов. Из вопроса не совсем ясно, такой ли ответ вы хотели получить. Если вам нужно в одном методе обрабатывать разные клики по одной кнопке, то предлагаю использовать другой подход, который больше подходит для WPF. А именно - команды. В качестве примера предположим, что у вас есть некоторое число, которые вы хотите уменьшать на единицу при нажатии правой кнопки и увеличивать на единицу при нажатии левой кнопки. Пишите простую VM: public class MainViewModel : INotifyPropertyChanged { private int count; public int Count { get { return count; } set { count = value; OnPropertyChanged("Count"); } } private ICommand clickCommand; public ICommand ClickCommand { get { return clickCommand; } set { clickCommand = value; } } public void buttonClick(object param) { int value = Convert.ToInt32(param); if (value == 0) Count++; else if (value == 1) Count--; } public MainViewModel() { clickCommand = new RelayCommand(buttonClick); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string name) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } } Наш метод принимает параметр, который показывает какая кнопка была нажата. Если 0- левая, если 1 - правая. Эти значения были выбраны произвольно, вы можете передавать в объект то, что посчитаете нужным. Теперь XAML: Для того, что определить какое действие нужно обработать используется Gesture: Чтобы узнать возможные варианты нужно обратится к перечислению MouseAction Код для RelayCommand не привожу, чтобы не загромождать ответ. Но вы без труда сможете найти подходящую реализацию. Например, тут Если код показался слишком большим - не пугайтесь ;) В дальнейшем вы будете пользоваться специальными библиотеками (например, FSharpViewModule для F# - проектов) или даже фреймверками (Prism) для крупных проектов которые упростят разработку.

Ответ 2



Отвечает за это событие MouseEventArgs

Ответ 3



Cначала приводите event к MouseEventArgs: MouseEventArgs me = (MouseEventArgs) e; Потом смотрите на: me.Button Либо посмотреть тут - для WPF ссылка

Ответ 4



Я относительно новичок и могу не знать всех тонкостей, но по-моему для определения кнопки проще использовать событие MouseDown: private void button_MouseDown( object sender, MouseEventArgs e ) { if(e.Button==MouseButtons.Right) { //Нажата правая кнопка } else if(e.Button==MouseButtons.Left) { //Нажата левая кнопка } else { //Нажата средняя кнопка } }

Кастомный Switch с подписями

#jquery #css #button #animate #switch


Есть Switch с подписями, при клике на сам switch он должен переключаться, так же
переключение может происходить при клике на значение.





.switch input {
  display: none;
}
.switch {
  width: 45px;
  height: 15px;
  position: relative;
  display: inline-block;
}
.slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: #00cc8c;
  transition: .3s;
}
.slider:before {
  content: "";
  height: 26px;
  width: 26px;
  position: absolute;
  left: 0;
  bottom: -5px;
  background-color: #008f62;
  transition: .3s;
}
input:checked + .slider {
  background-color: #f8ee7c;
}
input:focus + .slider {
  box-shadow: 0 0 1px #f8ee7c;
}
input:checked + .slider:before {
  transform: translateX(26px);
}
.slider.br {
  border-radius: 34px;
}
.slider.br:before {
  border-radius: 50%;
}





Возможно подключение jQuery. Сама изюминка вопроса в добавлении активных надписей
"Вкл/Выкл"

https://fiddle.jshell.net/w4t05476/
    


Ответы

Ответ 1



CSS: .selector-on { color: gray; cursor: pointer; } .selector-off { color: gray; cursor: pointer; } .switch input{ display:none; } .active-selector { color: #00cc8c; } .switch{ width: 45px; height: 15px; position: relative; display: inline-block; } .slider{ position: absolute; cursor: pointer; top: 0; right: 0; bottom: 0; left: 0; background-color: #00cc8c; transition: .3s; } .slider:before{ content: ""; height: 26px; width: 26px; position: absolute; left: 0; bottom: -5px; background-color: #008f62; transition: .3s; } input:checked + .slider{ background-color: #f8ee7c; } input:focus + .slider{ box-shadow: 0 0 1px #f8ee7c; } input:checked + .slider:before{ transform: translateX(26px); } .slider.br{ border-radius: 34px; } .slider.br:before{ border-radius: 50%; } HTML: On Off jQuery: function enableDisable(flag) { $('.my-checkbox').prop('checked', flag); $('.selector-on').toggleClass('active-selector', function() { return $(this).hasClass('active-selector') ? true : false; }); $('.selector-off').toggleClass('active-selector', function() { return $(this).hasClass('active-selector') ? true : false; }); } $('.selector-on').on('click', function(event) { return $(this).hasClass('active-selector') ? false : enableDisable(false); }); $('.selector-off').on('click', function(event) { return $(this).hasClass('active-selector') ? false : enableDisable(true); }); $('.my-checkbox').on('click', function() { if($(this).prop('checked')) { $('.selector-off').trigger('click'); } else { $('.selector-on').trigger('click'); } }); Пример

Ответ 2



$('input[type=checkbox]').before('On').after('Off'); $('input[type=checkbox]').onchange(function(){ $('#label_before').toggleClass('label_active'); $('#label_after').toggleClass('label_active'); }) Это если имеет смысл добавлять элементы через jQ. Я бы предпочел сразу все в html вставлять/через пхп генерить, не знаю, как там завязано у Вас все, но так не красиво, да и работает в идеале с одним свитчем. Код не тестировался, работоспособность не гарантируется. Гарантируется только смысл.

Ответ 3



.b-switch { margin: 15px 35px; font-family: 'segoe ui', sans-serif; font-size: 12px; } .b-switch input[type="checkbox"] { display: none; } .b-switch input[type="checkbox"] + label { width: 55px; height: 15px; position: relative; display: inline-block; background-color: #00cc8c; border-radius: 35px; transition: .3s; } .b-switch input[type="checkbox"] + label:before{ content: ""; position: absolute; left: -35px; top: 0; width: calc(100% + 70px); height: 100%; cursor: pointer; } .b-switch input[type="checkbox"] + label:after { content: ""; position: absolute; left: 0; bottom: -5px; height: 26px; width: 26px; background-color: #008f62; border-radius: 50%; cursor: pointer; transition: .3s; } .b-switch input[type="checkbox"] + label > span, .b-switch input[type="checkbox"] + label + span{ position: absolute; text-transform: uppercase; padding: 0 5px; color: #008F62; font-weight: 600; cursor: pointer; } .b-switch input[type="checkbox"] + label > span{ right: 100%; } .b-switch input[type="checkbox"]:checked + label{ background-color: #f8ee7c; } .b-switch input[type="checkbox"]:checked + label:after { left: calc(100% - 26px); } .b-switch input[type="checkbox"]:checked + label > span, .b-switch input[type="checkbox"] + label + span{ opacity: .5; pointer-events: none; } .b-switch input[type="checkbox"]:checked + label + span{ opacity: 1; }
Выкл
Выкл
Выкл


воскресенье, 2 февраля 2020 г.

Как сделать массив кнопок глобальной переменной?

#c_sharp #wpf #button


У меня есть массив кнопок с которыми я работаю через некоторые методы, и в каждом
из них приходится пересоздавать(Button[,] buttons = new Button[,]  {...}) этот массив
чтобы работать с ним. Можно ли этот массив сделать глобальной переменной?
    


Ответы

Ответ 1



Правильный способ: не использовать глобальных переменных. Плохой способ: объявить в каком-то одном классе, (который будет виден из нужных методов) статическую переменную (или свойство) нужного типа.

Ответ 2



Как говорилось ранее, глобальные переменные - это плохо. Но все зависит от того, насколько они глобальны, а именно - какова область видимости. К примеру, у нас есть класс формы, внутри которого есть методы, в которых необходим массив кнопок, к которому мы периодически обращаемся, будет выглядеть как-то так: public partial class MainWindow : Window { private Button[,] buttons; // может быть Button[]? public MainWindow() { InitializeComponent(); buttons = new Button[,] {...} // тут мы инициализируем наш массив (к примеру) } private void button_Click(object sender, RoutedEventArgs e) { // внутри метода мы как-то работаем с нашим массивом кнопок } private void button1_Click(object sender, RoutedEventArgs e) { // внутри метода мы как-то работаем с нашим массивом кнопок } } Привел примитивный пример, где buttons видимо в пределах MainWindow. В таком виде это все же выглядит не так страшно, как могло бы быть на самом деле. Поэтому в Вашем случае необходимо выбрать оптимальную область видимости переменной. А еще, в принципе можно написать метод, который будет возвращать вам список кнопок лежащих на определенном компоненте, вот пример. Конечно, возможно это не подойдет для решения Вашей задачи, но осмелюсь предложить Вам в качестве примера для ознакомления. P.S.: Button[,] - это двумерный массив (взято из Вашего вопроса), возможно имеет смысл использовать одномерный массив Button[]?

пятница, 31 января 2020 г.

Назначение OnClickListener

#java #android #button #android_on_click #android_button


Доброго времени суток. 

Есть MainActivity реализующая интерфейс View.OnClickListener, соответственно есть
метод OnClick типа такого:

public void onClick(View v) {
    if (v.getId()==R.id.btnDel){   //Кнопка Удалить
        Button btnDel = (Button) v;
        btnDel.setText("Отмена");
        btnDel.setOnClickListener(oclBtnDelWhileDel);


Выше по коду я создаю oclBtnDelWhileDel таким:

View.OnClickListener oclBtnDelWhileDel = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Button btnDel = (Button) v;
        btnDel.setText("Удалить");
        btnDel.setOnClickListener(this);
    }
} ;


Идея в том что метод OnClick класса назначает кнопке слушателя oclBtnDelWhileDel,
а oclBtnDelWhileDel назначает слушателем обратно метод OnClick.

Проблема в том, что при первом нажатии на кнопку, она меняет название на "Отмена"
и назначается слушатель oclBtnDelWhileDel. 

А вот при втором нажатии на кнопку название меняется на "Удалить", а вот слушатель
обратно не меняется. 

Через дебаггер выполняется опять код oclBtnDelWhileDel. 

Вопрос: не могу понять, почему?.
    


Ответы

Ответ 1



OnClickListener "прикрепляется" к определенной кнопке, и реализует метод обратного вызова (Callback), проще говоря, когда вы нажимаете на кнопку - происходит некоторое действие. Конкретно в вашей реализации очень много некрасивых мест, начиная с объявления кнопки при нажатии на другую кнопку - заканчивая установлением слушателя кнопки внутри реализации onClick другой кнопки. Вы можете просто менять динамически текст на кнопке, и выполнять тот, или иной функционал, допустим: if(btn.getText().equals("Удалить")){ // происходит операция удаления } else { //операция отмены. } Написано на коленке, и вероятно, ответ выше помог более по теме, но и этим не пренебрегайте. Зарефакторите код, станет легче.

Ответ 2



View.OnClickListener oclBtnDelWhileDel = new View.OnClickListener() { @Override public void onClick(View v) { Button btnDel = (Button) v; btnDel.setText("Удалить"); btnDel.setOnClickListener(this); //Вот тут ошибка } } ; В данном случае this указывает не на внешний класс, а на View.OnClickListener, таким образом вы устаналиваете слушателем его же самого

суббота, 11 января 2020 г.

Двухцветный Button [дубликат]

#android #button #background


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Как залить фон button частично?
                                
                                    (2 ответа)
                                
                        
                                Закрыт 3 года назад.
            
                    
Проблема такова. Нужно получить background у button как на этой картинке:


При этом нужно оставить возможность регулировать степень заполнения черным цветом
из кода. 

Как лучше это сделать?
    


Ответы

Ответ 1



Фон кнопки устанавливаете белый, а вместо картинки используете черный цвет, потом с помощью paddingRigth регулируете отступ с права. Примерно вот так: mImageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int width = mImageButton.getWidth(); int procent = 50; mImageButton.setPadding(0, 0, width*procent/100, 0); } }); Разметка:

четверг, 9 января 2020 г.

Как определить на какую кнопку нажал пользователь

#android #c_sharp #button #xamarin #click


Итак, есть 5 кнопок на экране, нужно определить на какую кнопку нажал пользователь
и взять её тег после чего редирект на другое активити. Пытался сделать это так:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    SetTheme(Android.Resource.Style.ThemeDeviceDefaultLightNoActionBar);
    SetContentView(Resource.Layout.MainScreen);

    Button BtnHm = (Button)FindViewById(Resource.Id.Home);
    BtnHm.Click += SwitchActivity;

    Button BtnSrch = (Button)FindViewById(Resource.Id.Search);
    BtnSrch.Click += SwitchActivity;

    Button BtnLstOfPh = (Button)FindViewById(Resource.Id.ListOfPhotos);
    BtnLstOfPh.Click += SwitchActivity;

    Button BtnGlr = (Button)FindViewById(Resource.Id.Glory);
    BtnGlr.Click += SwitchActivity;

    Button BtnMyAcc = (Button)FindViewById(Resource.Id.MyAcc);
    BtnMyAcc.Click += SwitchActivity;
}

public void SwitchActivity(object sender, EventArgs e)
{
    Button sendBtn = (Button)sender;

    switch (sendBtn.Tag)
    {
        case 1:
            Intent toMain = new Intent(this, typeof(MainScreenActivity));
            StartActivity(toMain);
            break;
        case 2:
            Intent toSearch = new Intent(this, typeof(SearchActivity));
            StartActivity(toSearch);
            break;
        case 3:
            Intent toPhoto = new Intent(this, typeof(ListOfPhotoActivity));
            StartActivity(toPhoto);
            break;
        case 4:
            Intent toGlory = new Intent(this, typeof(GloryActivity));
            StartActivity(toGlory);
            break;
        case 5:
            Intent toUser = new Intent(this, typeof(UserActivity));
            StartActivity(toUser);
            break;
    }
}


Но мне подчеркивает в case цифры и пишет что требуется постоянное значение. Как исправить?


    


Ответы

Ответ 1



Чтобы вы ни писали в xml, в свойство Tag любое значение будет паковаться (Tag - всё же object). При запросе свойства вы будете всегда получать object, поэтому нужно провести распаковку: switch ((int) sendBtn.Tag)

Ответ 2



Тебе нужно присвоить каждой кнопке Id и в конструкции switch() искать view-элемент по id пример: switch(sendBtn.getId()){ case R.id.btn1: ... case R.id.btn2: ...} Если это не подходит для Вашего языка программирования, я надеюсь, что мой ответ подскажет вам путь решения данной проблемы. Всего хорошего)

Ответ 3



XAML `

пятница, 20 декабря 2019 г.

Как не писать код для каждой из 36 кнопок в WPF в C#?

#c_sharp #wpf #button #click


В WPF присутствует 36 кнопок, при нажатии на каждую, должна изменятся переменная
и выводится сообщение.
Есть ли способ не писать по 36 раз в мейне:

public void button_Click1(object sender, RoutedEventArgs e)
    {
        amount += 100;
        System.Windows.MessageBox.Show("Message");
    }


И при такой возможности, можно ли будет дать каждой кнопке свое сообщение?

Дополнено: 

Я немного не понял. Можно расжевать?
Будет как то так?


Ответы

Ответ 1



Кто вам мешает вешать обработчик на один и тот же метод?

воскресенье, 15 декабря 2019 г.

Как сделать адаптивную кнопку со сложным фоном на CSS?

#html #css #input #button


собственно вот на 

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


Ответы

Ответ 1



Можно сделать по такому принципу: div { position: relative; display: inline-block; padding: 0 60px; height: 27px; line-height: 27px; vertical-align: middle; color: white; background: url(https://i.stack.imgur.com/CQPcT.jpg) repeat-x 0 0; } div:before { content: ''; position: absolute; top: 0; left: 0; width: 60px; height: 27px; background: url(https://i.stack.imgur.com/SyKbw.png) no-repeat left -10px top -6px; } div:after { content: ''; position: absolute; top: 0; right: 0; width: 60px; height: 27px; background: url(https://i.stack.imgur.com/SyKbw.png) no-repeat right -12px top -6px; }
la-la
ooo la-la!
Полоски сверху и снизу можете добавить отдельно с помощью liner-gradient спозиционированные абсолютно.

Стиль кнопки как в Windows

#html #css #button #style


Как сделать такой же стиль кнопки при наведении ?


    


Ответы

Ответ 1



Взято из ответа c enSO. a.button { height: 18px; padding: 2px 8px; border: 1px solid #F3F3F3; -moz-box-shadow: 0 0 0 1px #707070; -webkit-box-shadow: 0 0 0 1px #707070; box-shadow: 0 0 0 1px #707070; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background: -moz-linear-gradient(top, #F2F2F2 0%, #EBEBEB 50%, #DDDDDD 51%, #CFCFCF 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0,#F2F2F2), color-stop(0.5,#EBEBEB),color-stop(0.51,#DDDDDD),color-stop(1,#CFCFCF)); background: linear-gradient(top, #F2F2F2 0%, #EBEBEB 50%, #DDDDDD 51%, #CFCFCF 100%); font: normal 12px sans-serif; color: black; text-decoration: none; } a.button:hover { border: 1px solid #ECF7FD; -moz-box-shadow: 0 0 0 1px #3C7FB1; -webkit-box-shadow: 0 0 0 1px #3C7FB1; box-shadow: 0 0 0 1px #3C7FB1; background: -moz-linear-gradient(top, #EAF6FD 0%, #D9F0FC 50%, #BEE6FD 51%, #A7D9F5 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0,#EAF6FD), color-stop(0.5,#D9F0FC),color-stop(0.51,#BEE6FD),color-stop(1,#A7D9F5)); background: linear-gradient(top, #EAF6FD 0%, #D9F0FC 50%, #BEE6FD 51%, #A7D9F5 100%); } a.button:active { padding: 2px 7px 3px 9px; border: 1px solid #73A7C4; border-bottom: 0; -moz-box-shadow: 0 0 0 1px #2C628B; -webkit-box-shadow: 0 0 0 1px #2C628B; box-shadow: 0 0 0 1px #2C628B; background: -moz-linear-gradient(top, #E5F4FC 0%, #C4E5F6 50%, #98D1EF 51%, #68B3DB 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0,#E5F4FC), color-stop(0.5,#C4E5F6),color-stop(0.51,#98D1EF),color-stop(1,#68B3DB)); } Click me http://jsfiddle.net/aUsxy/1/

суббота, 14 декабря 2019 г.

Отличие работы кода в Mozilla и Chrome

#button #mozilla #click


Есть код

    


При клике на кнопке на слово Button в Chrome выдаёт I, а Mozilla  - BUTTON. Почему
так и как сделать так, чтобы и в Mozilla выдаrвался самый глубокий элемент
    


Ответы

Ответ 1



Похоже, Firefox следует рекомендациям W3C: Content model: Phrasing content, but there must be no interactive content descendant. То есть

среда, 11 декабря 2019 г.

swift: in-app purchase

#ios #swift #button


Нужно на кнопке показать стоимость встроенной покупки в валюте страны покупателя. 

Для России мой текст выглядит так: 299.00 RUB 


Как посмотреть как выглядит покупка для США?
Как вместо RUB поставить знак ₽ или вместо USD знак $? 


Мой код:

func productsRequest (_ request: SKProductsRequest, didReceive response: SKProductsResponse) {

    let count : Int = response.products.count
    if (count>0) {
        let validProduct: SKProduct = response.products[0] as SKProduct
        if (validProduct.productIdentifier == self.product_id) {
            print(validProduct.localizedTitle)
            print(validProduct.localizedDescription)
            print(validProduct.price)
            buyProduct(product: validProduct);

            let numberFormatter = NumberFormatter()
            numberFormatter.formatterBehavior = .behavior10_4
            numberFormatter.numberStyle = .currency
            numberFormatter.locale = validProduct.priceLocale
            let price = numberFormatter.string(from: validProduct.price)
            self.buyButton.setTitle(price, for: .normal)
            NSLog("The price of this product is \(validProduct.price)")
        } else {
            print(validProduct.productIdentifier)
        }
    } else {
        print("nothing")
    }
}


UPD

func buyProduct(product: SKProduct){
    print("Sending the Payment Request to Apple");
    let payment = SKPayment(product: product)
    let price = localizedPriceForProduct(product)
    buyButton.setTitle("\(price)", for: .normal)
    SKPaymentQueue.default().add(payment);

}

func localizedPriceForProduct(_ product:SKProduct) -> String {
    let priceFormatter = NumberFormatter()
    priceFormatter.formatterBehavior = NumberFormatter.Behavior.behavior10_4

    priceFormatter.numberStyle = NumberFormatter.Style.currencyISOCode
    //эта строка отвечает за формат написания (USD или $ использовать .currency)

    priceFormatter.locale = product.priceLocale
    return priceFormatter.string(from: product.price)!
}

    


Ответы

Ответ 1



func localizedPriceForProduct(_ product:SKProduct) -> String { let priceFormatter = NumberFormatter() priceFormatter.formatterBehavior = NumberFormatter.Behavior.behavior10_4 priceFormatter.numberStyle = NumberFormatter.Style.currencyISOCode //эта строка отвечает за формат написания (USD или $ использовать .currency) priceFormatter.locale = product.priceLocale return priceFormatter.string(from: product.price)! } Вызовите функцию: var product = SKProduct() ... let price = localizedPriceForProduct(product)

Ответ 2



1) посмотреть какой банк предоставляет API для перевода валют по текущему курсу. И использовать этот API 2) использовать replacingOccurrences let aString = "100 USD!" let newString = aString.replacingOccurrences(of: "USD", with: "$", options: .literal, range: nil)

вторник, 10 декабря 2019 г.

Как привязать клавишу клавиатуры к button С# form?

#c_sharp #winforms #button #клавиатура


Подскажите пожалуйста, как привязать клавишу клавиатуры к button С# form? Событие
Click уже занято. А KeyPress не пойму как работает. Пишу калькулятор.
    


Ответы

Ответ 1



WinForms и клавиатура, довольно веселое сочетание, особенно когда пытаешься их заставить работать согласованно. 1. События Control.Key* Любой контрол умеет реагировать на нажатия клавиш и для этого определены несколько событий: Control.KeyDown, Control.KeyPress, Control.KeyUp. Вроде бы все нормально, подписываемся на события и получаем реакцию на клавиши. Но тут есть один подвох - эти события срабатывают только когда контрол находится в фокусе. Кроме того, многие контролы уже имеют стандартные обработчики клавиш, многие реагируют на пробел как на клик, а TextBox и его родственники перехватывают почти всю клавиатуру. 2. Форма тоже контрол Класс Form также наследуется от контрол, и умеет получать эти события. Вроде бы очевидно, переносим обработку клавиш в события формы и радуемся, она же вроде бы всегда в фокусе. Но и тут не все так просто. Если дочерний контрол настроен на обработку клавиш и находится в фокусе (а если на форме есть дочерние контролы, то один из них обязательно в фокусе), то форма просто игнорирует нажатия на клавиши. Можно вспомнить о свойстве формы Form.KeyPreview, которое предназначено для перехвата событий, тогда события клавиатуры будут сначала передаваться в форму. Это вроде бы рабочий вариант, но если вы не хотите чтобы стандартный функционал контролов все еще работал, то придется не забыть выставить свойство KeyPressEventArgs.Handled = false; чтобы после обработки события клавиатуры на уровне формы, оно было передано в дочерние контролы. Честно говоря, это не самый лучший вариант, т.к. имеет свои ограничения и далеко не все задачи можно решить таким способом. Хотя он вроде для этого и задуман. 3. Нас спасет меню Первый вариант решения проблемы относительно без шаманства - добавить на форму меню в лице MenuStrip. Меню сделано таким образом, что к каждому его элементу, можно привязать хоткей, а для их корректной работы меню перехватывает все события клавиатуры и отдает дальше только те, которые не связаны с нажатиями на заданные клавиши и сочетания. Способ всем хорош, кроме пары моментов: для всех нужных клавиш и сочетаний нужен пункт в меню и необходимо само меню на форме. Если первая проблема еще может быть решена применением скрытых элементов (лично не проверял), то вторая - реально проблема, т.к. не любая форма приложения допускает наличие на ней меню, а добавлять его только ради обработки клавиш... ну вы меня поняли. 4. Универсальное решение Не торопитесь радоваться, все предыдущие пункты требовали только мастерского владения кликом мыши в интерфейс конструктора, а тут потребуется писать код. В форме, как и любом контроле есть виртуальный метод ProcessCmdKey, который отвечает за дефолтную обработку событий клавиатуры, вот его-то и потребуется переопределить в нашей форме для получения ожидаемой и корректной работы с клавиатурой. protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { //ваша логика тут return base.ProcessCmdKey(ref msg, keyData); } Вызов базового метода - не обязателен. За передачу события дочерним контролам отвечает результат работы метода, только логика немного наоборот: true - клавиша обработана, дальнейшая обработка не требуется; false - событие будет передано дочерним контролам, даже если вы выполнили какую-то предварительную обработку. Таким образом вы получаете полный контроль над обработкой событий клавиатуры на уровне формы или кастомного контрола. Преимущество данного метода заключается еще и в том, что вы получаете доступ к параметру keyData, который, в отличие от KeyPressEventArgs содержит не только отображаемый символ, а всю информацию о нажатой клавише, включая скан-код, состояние клавиш-модификаторов и другую полезную информацию. За то, какое именно событие произошло, отвечает параметр msg, который содержит системное сообщение WinAPI. Нас интересуют относящиеся к клавиатуре WM_KEYDOWN и WM_KEYUP. Событие KeyPress - фактически последовательное получение WM_KEYDOWN и WM_KEYUP. 5. Ну и как этим воспользоваться? Да собственно как и обычно. Нажатие на клавишу и клик по кнопке это действие пользователя, которое должно вызвать какую-то реакцию программы. Реакцию описываем отдельным приватным методом, а в обработчики клика кнопки и нажатия на клавишу кладем вызов этого метода. Такой подход избавляет от необходимости копировать код, сводит код обработчиков событий к минимуму, позволяет вызывать заданную реакцию программы любым нужным способом, будь то клик по какому либо контролу, выбор чекбокса или радио-баттона, клавиша или сочетание, пункт меню или все сразу. Код реакции находится в одном месте и при необходимости его изменить не придется думать где еще вы его забыли поправить. Если хватит энтузиазма, позже соберу в этом ответе ссылки на связанные вопросы с хорошими ответами. А пока первое что нашлось по теме без глубокого копания: Как правильно перехватывать нажатия клавиш в Windows Forms (C++)? Обработка нажатий на цифровую клавиатуру

Ответ 2



Если я правильно понял вопрос, то вы можете использовать событие KeyDown. При нажатии на кнопку пробел выполнится код кнопки private void button1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Space) MessageBox.Show("Hello!"); }

суббота, 6 июля 2019 г.

Изменение картинки в кнопке при наведении

Столкнулся с проблемой, есть кнопка с картинкой svg, при наведении на кнопку нужно поменять стиль кнопки и цвет этого изображения. Если первое не вызывает затруднений, то со вторым проблемы. Знаю что можно менять цвет картинки svg через fill, но чего-то не работает, возможно я сам не до конца понимаю как его использовать. Ещё как вариант вижу, просто заменить картинку на такую же, просто другого цвета, но не до конца понимаю как.
.imga{ color: rgb(35, 112, 142); } .imga:hover{ border-radius: 10px; color: red; font-size: 14px; }


Ответ

Обычно для такого используют css background. Если добавлять svg через тег img, то повлиять на стили нельзя. Сделайте две картинки (или спрайт), этого будет достаточно. Есть варианты использования keyframes, svg, анимации, анимации с javascript, но это уже избыточно. Пример анимации SVG-иконки.
.imga { color: rgb(35, 112, 142); height: 24px; width: 120px; background-size: 18px; background-repeat: no-repeat; background-position: 5px left; transition: all .2s; } .imga { background: url('https://www.shareicon.net/data/128x128/2016/07/10/119178_chat_512x512.png') 5px center no-repeat; background-size: 18px; } .imga:hover{ border-radius: 10px; color: red; font-size: 14px; background: url('https://www.shareicon.net/data/512x512/2016/01/03/697450_chat_512x512.png') 5px center no-repeat; background-size: 18px; }

понедельник, 20 мая 2019 г.

Общие параметры

Можно ли задать параметры для всех Button/text/Label одной функцие, чтобы не писать к каждой кнопке одинаковые параметры? К примеру, я создал много однотипных кнопок для ввода данных калькулятора:
bttn1_1 = Button(root, text='MC', font='Arial 15', width=3, height=1, bd=4, background='SkyBlue2', activebackground='green yellow')


Ответ

Примерно так можно:
buttons = {}
for button_text in map(str, range(10)): button = Button(root, text=button_text, font='Arial 15', width=3, height=1, bd=4, background='SkyBlue2', activebackground='green yellow') buttons[button_text] = button
Кнопка с текстом 1
buttons['1']

Еще можно создать функцию которая обрезает/исправляет параметры:
def create_button(text): return Button(root, text=text, font='Arial 15', width=3, height=1, bd=4, background='SkyBlue2', activebackground='green yellow')

вторник, 2 апреля 2019 г.

Назначение OnClickListener

Доброго времени суток.
Есть MainActivity реализующая интерфейс View.OnClickListener, соответственно есть метод OnClick типа такого:
public void onClick(View v) { if (v.getId()==R.id.btnDel){ //Кнопка Удалить Button btnDel = (Button) v; btnDel.setText("Отмена"); btnDel.setOnClickListener(oclBtnDelWhileDel);
Выше по коду я создаю oclBtnDelWhileDel таким:
View.OnClickListener oclBtnDelWhileDel = new View.OnClickListener() { @Override public void onClick(View v) { Button btnDel = (Button) v; btnDel.setText("Удалить"); btnDel.setOnClickListener(this); } } ;
Идея в том что метод OnClick класса назначает кнопке слушателя oclBtnDelWhileDel, а oclBtnDelWhileDel назначает слушателем обратно метод OnClick
Проблема в том, что при первом нажатии на кнопку, она меняет название на "Отмена" и назначается слушатель oclBtnDelWhileDel.
А вот при втором нажатии на кнопку название меняется на "Удалить", а вот слушатель обратно не меняется.
Через дебаггер выполняется опять код oclBtnDelWhileDel.
Вопрос: не могу понять, почему?.


Ответ

OnClickListener "прикрепляется" к определенной кнопке, и реализует метод обратного вызова (Callback), проще говоря, когда вы нажимаете на кнопку - происходит некоторое действие.
Конкретно в вашей реализации очень много некрасивых мест, начиная с объявления кнопки при нажатии на другую кнопку - заканчивая установлением слушателя кнопки внутри реализации onClick другой кнопки.
Вы можете просто менять динамически текст на кнопке, и выполнять тот, или иной функционал, допустим:
if(btn.getText().equals("Удалить")){
// происходит операция удаления } else {
//операция отмены.
}
Написано на коленке, и вероятно, ответ выше помог более по теме, но и этим не пренебрегайте.
Зарефакторите код, станет легче.