Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > .NET: Общие вопросы > Панель кнопок |
Автор: kms 24.06.18, 10:33 |
Имеется вот такая панель кнопок, в ScrollViewer1 вложен StackPanel с сотней кнопок, на каждой кнопке SteckPanel с Image, CheckBox и TextBlock, CheckBox управляет видимостью своей кнопки, сейчас сделано так: в каждом CheckBox_Unchecked делаю невидимым соответствующую кнопку but1.Visibility = Visibility.Collapsed; и так сто раз , а как сделать по компактней ? ______1.png (, : 434) |
Автор: VisualProg 24.06.18, 16:45 |
Самый простой способ, который первым приходит в голову - дать каждому check-у ссылку на кнопку, и всем checkbox-ам сопоставить одно общее событие. Второй вариант - сделать массив check-ов и массив кнопок. А ещё лучше каким нибудь списком всё переделать... обычно, делается подобное с помощью создания правил/доступа к конкретному элементу - как это реализовывать нет однозначной рекомендации. 100 кнопок это уже достаточно много, потому придётся кое что менять в уже реализованной архитектуре. |
Автор: kms 24.06.18, 19:34 |
Цитата VisualProg @ дать каждому check-у ссылку на кнопку, и всем checkbox-ам сопоставить одно общее событие. вот вот я и хочу реализовать несколько способов по отдельности , вот это я и хочу сейчас сделать , начну с малого , как дать каждому check-у ссылку на кнопку, ??? я попробовал вот так MainWindow.XAML <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> <Button x:Name="but1" Visibility="{Binding ElementName=chBox1,Path=Checked}" т.е в кнопке "but1" пропысываю видимость в зависимости от CheckBox - "chBox1" но что то не правильно , не работает , либо я что то не та кпонимаю |
Автор: kms 24.06.18, 20:51 |
нашел вот такое решение в кнопке прописываю <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> .... <Window.Resources> <local:BoolToVisibilityConverter x:Key="boolToVisibilityConverter"/> </Window.Resources> ... ...... <Button x:Name="but1" Visibility="{Binding ElementName=chBox1, Path=IsChecked, Converter={StaticResource boolToVisibilityConverter}}" ..... вот , теперь при снятии галочки на каждой кнопке эта кнопка исчезает , код упростился на 1000 строк, уже хорошо , теперь как бы сделать чтобы при нажатии кнопки "Показать все кнопки" видимость востанавливалась ______2.png (, : 421) |
Автор: kms 25.06.18, 00:17 |
ОК вот так получилось <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> private void ButtonAll_Click(object sender, RoutedEventArgs e) //показать все кнопки { var but = FindChilds<Button>(Application.Current.MainWindow); for (int i = 0; i < but.Count; i++) { var chBox = FindChilds<CheckBox>(but[i]); for (int j = 0; j < chBox.Count; j++) chBox[j].IsChecked = true ; } } теперь надо сохранить состояние при закрытии, что бы при следующем открытии открылось также |
Автор: VisualProg 25.06.18, 09:30 |
Выбирайте что больше понравится: 1. Запись в файл 2. Запись в реестр Можете ещё погуглить сериализацию формы (хотя, в вашем случае, это избыточно... ну, хотябы узнаете что такое существует) |
Автор: Koss 25.06.18, 12:28 |
сериализация в xml (10 строк кода хмл знать не обязательно), а дальше хоть в файл хоть в БД. Гуглить класс XmlSerializer. В него ты можешь хоть всю вьюмодель засунуть, и так же высунуть. Ты так и не читал про mvvm, поэтому у тебя код ещё не отделён от интерфейса. Вот тут короткий и простой код с титульным паттерном, ради которого впф и создавался, я считаю. |
Автор: kms 25.06.18, 19:42 |
буду делать и то и то, сериализацию формы тоже буду пробывать, читал , только у меня такое отношение к этому - от простого к сложному , сначала реализую , пусть и с костылями по простому по деревенски , потом уже MVVM , тем более MVVM тоже не рекомендуют применять где надо и где не надо, я считаю моя програмулька не тянет на применение патернов, в том то и дело что я много почитал про это но применять так повода и нету , а то до анегдота доходит , на одном форуме парню надо было сделать вьюшку для вывода суммы , а ему насоветовали через патерн , задача на 1 строчку кода , а с MVVM получился монстр в 10 файлов .... ну это все вода спасибо за советы, буду пробывать конечно и MVVM |
Автор: kms 26.06.18, 19:16 |
сделал через реестр , сохраняется работает, ОК , теперь через XML хочу настройки всех кнопок из DataGrid сохранить в XML , <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> private void butSaveXML_Click(object sender, RoutedEventArgs e) // нажали кн. "Сохранить в XML" { XmlSerializer formatter = new XmlSerializer(typeof(ButtonsEIIS)); using (FileStream fs = new FileStream(@"XML.XML", FileMode.OpenOrCreate)) { formatter.Serialize(fs,DataGrid1); } } но выдает ошибку , <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> InvalidCastException: Не удалось привести тип объекта "System.Windows.Controls.DataGrid" к типу "ПанельКнопок.Buttons". класс у меня такой <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> [Serializable] public class Buttons { public bool VisibilityBut { get; set; } public string Name { get; set; } public string PathImag { get; set; } public string PathExe { get; set; } } |
Автор: Koss 27.06.18, 09:07 |
typeof(ButtonsEIIS) |
Автор: kms 27.06.18, 19:56 |
Koss ОК спасибо, за эти дни намучился с этим XML , везде в основном расказывается как делать через MVVM или WinForms, вообщем на одном буржуйском форуме нашел переделал, работает но не так как хотелось бы, теперь сам DataGrid не могу настроить , вывод шапки русскими буквами не могу сделать, и еще одна загвоздка сейчас делаю обработку события Click по кнопке, по простому само собой работает т.е. на каждой кнопке висит событие , как сделать одной процедурой в пару строк |
Автор: kms 27.06.18, 22:35 |
вот примерно так , прописал <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> private void But_Click(object sender, RoutedEventArgs e) // --------------- обработка клика по кнопке { XmlSerializer serializer = new XmlSerializer(typeof(ButtonEIISCollection));// Инициализируеv новый экземпляр FileStream stream = new FileStream("PanButtons.xml", FileMode.Open);//Инициализируем новый файловый поток IEnumerable<ButtonEIIS> pathExe = (IEnumerable<ButtonEIIS>)serializer.Deserialize(stream);//заполняем перечислитель десериализованными данными из файлового потока в котором находится наш файл PanButtons.xml с настройками для кнопок int n = Convert.ToInt32(((Button)sender).Name.Substring(((Button)sender).Name.Length - 3));//номер кнопки получаем из имени кнопки, имя берем из отправителя события ( нумерация кнопок сверху вниз ) string file = (pathExe.ElementAt(n - 1)).PathEXE; // приготавливаем полный путь к .exe-шнику stream.Dispose();// Освобождает все ресурсы, занятые файловым потоком if ( File.Exists(file)) // Определяем, существует ли заданный .exe-шник System.Diagnostics.Process.Start(file); // запускаем .exe-шник назначеный на эту кнопку else MessageBox.Show("Файл не найден");//если по каким то причинам .exe-шник не найден } а потом в каждой кнопке в событии установил Click="But_Click", чтобы через конструктор не мучатся в XAML копипастом вставил , |
Автор: kms 01.07.18, 20:55 |
Собрав все в кучу получилось вот такое __________________.png (, : 434) Добавлено Если у кого будет время попробуйте, https://github.com/vovakms/PanelButtons если кого заинтересует отвечу на вопросы исходники выложу , критика приветствуется |
Автор: kms 12.07.18, 08:30 |
Улучшил , доделал , немного подкрасил , вообщем стала удобней и красивше , можно выбирать из нескольких корневых каталогов , иконки грабятся на лету из EXE-шников и вставляются на кнопку , исходник выложил , качайте переделывайте под себя , особенно я думаю не всем нравится высота кнопок , как то надо наверно в пользовательские настройки вынести, сворачивается к левому краю рабочего стола оставляя только узкую полоску для клика , критика принимается , посоветуйте как сделать удобней и лучше |
Автор: kms 12.07.18, 08:43 |
внешний вид , и окно настройки pr1.png (, : 426) |
Автор: kosten 12.07.18, 11:35 |
kms, это какой-то рабочий проект или учебный? |
Автор: kms 12.07.18, 19:03 |
делал для себя , так ради спортивного интереса, изучал возможности C#WPF , а потом получилось так что теперь и на работе применяю (~сотня юзеров) , можете и как учебный использовать , основные моменты в тексте коментированы, проект чисто стандартный, без всяких добавлений библиотек и фрейм ворков, если Вас интересуют учебные посмотрите у меня там же есть чат, простейший тоже C# WPF. https://github.com/vovakms/Chat |
Автор: kosten 13.07.18, 04:38 |
kms, сотня пользователей не жалуется на интерфейс? |
Автор: kms 13.07.18, 09:00 |
покамисть молчат, но как только начнут буду опреативно исправлять , если бы кто еще посоветовал как покрасивше сделать , а то у меня медведь на ухо наступил , слуха нету , вернее в красоте не шибко понимаю , короче дизайнерской жилки у меня нету за совет буду благодарен |
Автор: kosten 13.07.18, 12:04 |
Изучайте рекомендации от производителя Windows. |
Автор: kms 13.07.18, 22:38 |
Это понятно конечно , но читая рекомендации и прекрасно понимая цветовую концепцию , это мне ни чего не дает , вообщем пока мне не скажут что вот этот фон должен быть таким то а этот таким то посоветуйте что нибудь тогда по внутренней архитектуре кода или устройству приложения или хотя бы юзабелити интерфейса , а уж цветовую бог с ней , кто хочет пусть ставит какую хочет для себя , я сейчас делаю пользовательскую установку цветовой темы , т.е. сам пользователь будет выбирать себе цветовую тему |