Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата kms @
а как сделать по компактней ?

Самый простой способ, который первым приходит в голову - дать каждому 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
Цитата kms @
теперь надо сохранить состояние при закрытии


Выбирайте что больше понравится:
1. Запись в файл
2. Запись в реестр

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

Автор: Koss 25.06.18, 12:28
сериализация в xml (10 строк кода хмл знать не обязательно), а дальше хоть в файл хоть в БД. Гуглить класс XmlSerializer. В него ты можешь хоть всю вьюмодель засунуть, и так же высунуть. Ты так и не читал про mvvm, поэтому у тебя код ещё не отделён от интерфейса. Вот тут короткий и простой код с титульным паттерном, ради которого впф и создавался, я считаю.

Автор: kms 25.06.18, 19:42
Цитата VisualProg @
Выбирайте что больше понравится:
1. Запись в файл
2. Запись в реестр


буду делать и то и то, сериализацию формы тоже буду пробывать,

Цитата Koss @
Ты так и не читал про mvvm, поэтому у тебя код ещё не отделён от интерфейса.


читал , только у меня такое отношение к этому - от простого к сложному , сначала реализую , пусть и с костылями по простому по деревенски , потом уже 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
Цитата kms @
короче дизайнерской жилки у меня нету за совет буду благодарен

Изучайте рекомендации от производителя Windows.

Автор: kms 13.07.18, 22:38
Это понятно конечно , но читая рекомендации и прекрасно понимая цветовую концепцию , это мне ни чего не дает , вообщем пока мне не скажут что вот этот фон должен быть таким то а этот таким то
посоветуйте что нибудь тогда по внутренней архитектуре кода или устройству приложения или хотя бы юзабелити интерфейса , а уж цветовую бог с ней , кто хочет пусть ставит какую хочет для себя , я сейчас делаю пользовательскую установку цветовой темы , т.е. сам пользователь будет выбирать себе цветовую тему

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)