На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Панель кнопок
    Имеется вот такая панель кнопок,
    в ScrollViewer1 вложен StackPanel с сотней кнопок,
    на каждой кнопке SteckPanel с Image, CheckBox и TextBlock,
    CheckBox управляет видимостью своей кнопки,

    сейчас сделано так:
    в каждом CheckBox_Unchecked делаю невидимым соответствующую кнопку
    but1.Visibility = Visibility.Collapsed;
    и так сто раз , а как сделать по компактней ?
    Прикреплённый файлПрикреплённый файл______1.png (35,48 Кбайт, скачиваний: 430)
      Цитата kms @
      а как сделать по компактней ?

      Самый простой способ, который первым приходит в голову - дать каждому check-у ссылку на кнопку, и всем checkbox-ам сопоставить одно общее событие.
      Второй вариант - сделать массив check-ов и массив кнопок.

      А ещё лучше каким нибудь списком всё переделать... обычно, делается подобное с помощью создания правил/доступа к конкретному элементу - как это реализовывать нет однозначной рекомендации. 100 кнопок это уже достаточно много, потому придётся кое что менять в уже реализованной архитектуре.
        Цитата VisualProg @
        дать каждому check-у ссылку на кнопку, и всем checkbox-ам сопоставить одно общее событие.


        вот вот я и хочу реализовать несколько способов по отдельности , вот это я и хочу сейчас сделать , начну с малого , как дать каждому check-у ссылку на кнопку, ???
        я попробовал вот так

        MainWindow.XAML
        ExpandedWrap disabled
          <Button x:Name="but1" Visibility="{Binding ElementName=chBox1,Path=Checked}"


        т.е в кнопке "but1" пропысываю видимость в зависимости от CheckBox - "chBox1"

        но что то не правильно , не работает , либо я что то не та кпонимаю
          нашел вот такое решение
          в кнопке прописываю

          ExpandedWrap disabled
            ....
            <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 Кбайт, скачиваний: 418)
            ОК вот так получилось

            ExpandedWrap disabled
              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  ;
                          }
                      }


            теперь надо сохранить состояние при закрытии, что бы при следующем открытии открылось также
              Цитата kms @
              теперь надо сохранить состояние при закрытии


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

              Можете ещё погуглить сериализацию формы (хотя, в вашем случае, это избыточно... ну, хотябы узнаете что такое существует)
                сериализация в xml (10 строк кода хмл знать не обязательно), а дальше хоть в файл хоть в БД. Гуглить класс XmlSerializer. В него ты можешь хоть всю вьюмодель засунуть, и так же высунуть. Ты так и не читал про mvvm, поэтому у тебя код ещё не отделён от интерфейса. Вот тут короткий и простой код с титульным паттерном, ради которого впф и создавался, я считаю.
                Сообщение отредактировано: Koss -
                  Цитата VisualProg @
                  Выбирайте что больше понравится:
                  1. Запись в файл
                  2. Запись в реестр


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

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


                  читал , только у меня такое отношение к этому - от простого к сложному , сначала реализую , пусть и с костылями по простому по деревенски , потом уже MVVM , тем более MVVM тоже не рекомендуют применять где надо и где не надо, я считаю моя програмулька не тянет на применение патернов, в том то и дело что я много почитал про это но применять так повода и нету , а то до анегдота доходит , на одном форуме парню надо было сделать вьюшку для вывода суммы , а ему насоветовали через патерн , задача на 1 строчку кода , а с MVVM получился монстр в 10 файлов ....
                  ну это все вода
                  спасибо за советы, буду пробывать конечно и MVVM
                    сделал через реестр , сохраняется работает, ОК , теперь через XML
                    хочу настройки всех кнопок из DataGrid сохранить в XML ,
                    ExpandedWrap disabled
                      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);
                                  }
                       
                       
                              }


                    но выдает ошибку ,
                    ExpandedWrap disabled
                      InvalidCastException: Не удалось привести тип объекта "System.Windows.Controls.DataGrid" к типу "ПанельКнопок.Buttons".


                    класс у меня такой
                    ExpandedWrap disabled
                       [Serializable]
                          public class Buttons
                          {
                              public bool VisibilityBut { get; set; }
                              public string Name { get; set; }
                              public string PathImag { get; set; }
                              public string PathExe { get; set; }
                          }
                    Сообщение отредактировано: kms -
                      typeof(ButtonsEIIS)
                        Koss ОК спасибо, за эти дни намучился с этим XML , везде в основном расказывается как делать через MVVM или WinForms, вообщем на одном буржуйском форуме нашел переделал, работает но не так как хотелось бы, теперь сам DataGrid не могу настроить , вывод шапки русскими буквами не могу сделать, и еще одна загвоздка сейчас делаю обработку события Click по кнопке, по простому само собой работает т.е. на каждой кнопке висит событие , как сделать одной процедурой в пару строк
                          вот примерно так , прописал
                          ExpandedWrap disabled
                            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 копипастом вставил ,
                            Собрав все в кучу получилось вот такое
                            Прикреплённый файлПрикреплённый файл__________________.png (88,49 Кбайт, скачиваний: 433)

                            Добавлено
                            Если у кого будет время попробуйте,
                            https://github.com/vovakms/PanelButtons
                            если кого заинтересует отвечу на вопросы исходники выложу , критика приветствуется
                            Сообщение отредактировано: kms -
                              Улучшил , доделал , немного подкрасил , вообщем стала удобней и красивше , можно выбирать из нескольких корневых каталогов , иконки грабятся на лету из EXE-шников и вставляются на кнопку , исходник выложил , качайте переделывайте под себя , особенно я думаю не всем нравится высота кнопок , как то надо наверно в пользовательские настройки вынести, сворачивается к левому краю рабочего стола оставляя только узкую полоску для клика , критика принимается , посоветуйте как сделать удобней и лучше
                                внешний вид , и окно настройки
                                Прикреплённый файлПрикреплённый файлpr1.png (77,44 Кбайт, скачиваний: 422)
                                  kms, это какой-то рабочий проект или учебный?
                                    делал для себя , так ради спортивного интереса, изучал возможности C#WPF , а потом получилось так что теперь и на работе применяю (~сотня юзеров) , можете и как учебный использовать , основные моменты в тексте коментированы, проект чисто стандартный, без всяких добавлений библиотек и фрейм ворков, если Вас интересуют учебные посмотрите у меня там же есть чат, простейший тоже C# WPF.
                                    https://github.com/vovakms/Chat
                                      kms, сотня пользователей не жалуется на интерфейс?
                                        покамисть молчат, но как только начнут буду опреативно исправлять , если бы кто еще посоветовал как покрасивше сделать , а то у меня медведь на ухо наступил , слуха нету , вернее в красоте не шибко понимаю , короче дизайнерской жилки у меня нету
                                        за совет буду благодарен
                                          Цитата kms @
                                          короче дизайнерской жилки у меня нету за совет буду благодарен

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


                                            Рейтинг@Mail.ru
                                            [ Script execution time: 0,0593 ]   [ 25 queries used ]   [ Generated: 28.03.24, 20:04 GMT ]