Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.14.6.194] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Имеется вот такая панель кнопок,
в ScrollViewer1 вложен StackPanel с сотней кнопок, на каждой кнопке SteckPanel с Image, CheckBox и TextBlock, CheckBox управляет видимостью своей кнопки, сейчас сделано так: в каждом CheckBox_Unchecked делаю невидимым соответствующую кнопку but1.Visibility = Visibility.Collapsed; и так сто раз , а как сделать по компактней ? Прикреплённый файл______1.png (35,48 Кбайт, скачиваний: 431) |
Сообщ.
#2
,
|
|
|
Цитата kms @ а как сделать по компактней ? Самый простой способ, который первым приходит в голову - дать каждому check-у ссылку на кнопку, и всем checkbox-ам сопоставить одно общее событие. Второй вариант - сделать массив check-ов и массив кнопок. А ещё лучше каким нибудь списком всё переделать... обычно, делается подобное с помощью создания правил/доступа к конкретному элементу - как это реализовывать нет однозначной рекомендации. 100 кнопок это уже достаточно много, потому придётся кое что менять в уже реализованной архитектуре. |
Сообщ.
#3
,
|
|
|
Цитата VisualProg @ дать каждому check-у ссылку на кнопку, и всем checkbox-ам сопоставить одно общее событие. вот вот я и хочу реализовать несколько способов по отдельности , вот это я и хочу сейчас сделать , начну с малого , как дать каждому check-у ссылку на кнопку, ??? я попробовал вот так MainWindow.XAML <Button x:Name="but1" Visibility="{Binding ElementName=chBox1,Path=Checked}" т.е в кнопке "but1" пропысываю видимость в зависимости от CheckBox - "chBox1" но что то не правильно , не работает , либо я что то не та кпонимаю |
Сообщ.
#4
,
|
|
|
нашел вот такое решение
в кнопке прописываю .... <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 (31,78 Кбайт, скачиваний: 419) |
Сообщ.
#5
,
|
|
|
ОК вот так получилось
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 ; } } теперь надо сохранить состояние при закрытии, что бы при следующем открытии открылось также |
Сообщ.
#6
,
|
|
|
Цитата kms @ теперь надо сохранить состояние при закрытии Выбирайте что больше понравится: 1. Запись в файл 2. Запись в реестр Можете ещё погуглить сериализацию формы (хотя, в вашем случае, это избыточно... ну, хотябы узнаете что такое существует) |
Сообщ.
#7
,
|
|
|
сериализация в xml (10 строк кода хмл знать не обязательно), а дальше хоть в файл хоть в БД. Гуглить класс XmlSerializer. В него ты можешь хоть всю вьюмодель засунуть, и так же высунуть. Ты так и не читал про mvvm, поэтому у тебя код ещё не отделён от интерфейса. Вот тут короткий и простой код с титульным паттерном, ради которого впф и создавался, я считаю.
|
Сообщ.
#8
,
|
|
|
Цитата VisualProg @ Выбирайте что больше понравится: 1. Запись в файл 2. Запись в реестр буду делать и то и то, сериализацию формы тоже буду пробывать, Цитата Koss @ Ты так и не читал про mvvm, поэтому у тебя код ещё не отделён от интерфейса. читал , только у меня такое отношение к этому - от простого к сложному , сначала реализую , пусть и с костылями по простому по деревенски , потом уже MVVM , тем более MVVM тоже не рекомендуют применять где надо и где не надо, я считаю моя програмулька не тянет на применение патернов, в том то и дело что я много почитал про это но применять так повода и нету , а то до анегдота доходит , на одном форуме парню надо было сделать вьюшку для вывода суммы , а ему насоветовали через патерн , задача на 1 строчку кода , а с MVVM получился монстр в 10 файлов .... ну это все вода спасибо за советы, буду пробывать конечно и MVVM |
Сообщ.
#9
,
|
|
|
сделал через реестр , сохраняется работает, ОК , теперь через XML
хочу настройки всех кнопок из DataGrid сохранить в XML , 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); } } но выдает ошибку , InvalidCastException: Не удалось привести тип объекта "System.Windows.Controls.DataGrid" к типу "ПанельКнопок.Buttons". класс у меня такой [Serializable] public class Buttons { public bool VisibilityBut { get; set; } public string Name { get; set; } public string PathImag { get; set; } public string PathExe { get; set; } } |
Сообщ.
#10
,
|
|
|
typeof(ButtonsEIIS)
|
Сообщ.
#11
,
|
|
|
Koss ОК спасибо, за эти дни намучился с этим XML , везде в основном расказывается как делать через MVVM или WinForms, вообщем на одном буржуйском форуме нашел переделал, работает но не так как хотелось бы, теперь сам DataGrid не могу настроить , вывод шапки русскими буквами не могу сделать, и еще одна загвоздка сейчас делаю обработку события Click по кнопке, по простому само собой работает т.е. на каждой кнопке висит событие , как сделать одной процедурой в пару строк
|
Сообщ.
#12
,
|
|
|
вот примерно так , прописал
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 копипастом вставил , |
Сообщ.
#13
,
|
|
|
Собрав все в кучу получилось вот такое
Прикреплённый файл__________________.png (88,49 Кбайт, скачиваний: 433) Добавлено Если у кого будет время попробуйте, https://github.com/vovakms/PanelButtons если кого заинтересует отвечу на вопросы исходники выложу , критика приветствуется |
Сообщ.
#14
,
|
|
|
Улучшил , доделал , немного подкрасил , вообщем стала удобней и красивше , можно выбирать из нескольких корневых каталогов , иконки грабятся на лету из EXE-шников и вставляются на кнопку , исходник выложил , качайте переделывайте под себя , особенно я думаю не всем нравится высота кнопок , как то надо наверно в пользовательские настройки вынести, сворачивается к левому краю рабочего стола оставляя только узкую полоску для клика , критика принимается , посоветуйте как сделать удобней и лучше
|
Сообщ.
#15
,
|
|
|
внешний вид , и окно настройки
Прикреплённый файлpr1.png (77,44 Кбайт, скачиваний: 423) |