Ответы пользователя по тегу C#
  • Как задать минимальную ширину кнопки (не её содержимого)?

    SpacePurr
    @SpacePurr
    c#, wpf
    Используйте свойство MinWidth у класса Window, а не Button.
    Ответ написан
    Комментировать
  • C#. Удалить из файла всё что не связано с введённым ID?

    SpacePurr
    @SpacePurr
    c#, wpf
    Здравствуйте.

    Дело было вечером, делать было нечего.

    Создаем класс UserInfo, в котором будем хранить наши строки.

    class UserInfo
    {
        public string ID { get; set; }
    
        public string AccountName { get; set; }
        public string PersonaName { get; set; }
        public string RememberPassword { get; set; }
        public string Mostrecent { get; set; }
        public string TimeStamp { get; set; }
    }


    Теперь порядок действий такой:
    1. Создаем список наших UserInfo
    2. Парсим файл и заполняем список
    3. На выходе фильтруем список по ID
    4. Создаем новый файл и записываем в него свойства объекта UserInfo, в данном случае строки файла

    class Program
    {
    
        static void Main(string[] args)
        {
            string path = @"E:\=NoDel=\Рабочий стол\Новый текстовый документ (2).txt";
    
            List<UserInfo> users = new List<UserInfo>();
    
            using (StreamReader sr = new StreamReader(path))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    if (line == "{")
                        users.Add(GetUserInfo(sr));
                }
            }
    
            string SelectedID = "\"76561198404997878\""; //например вот такой ID мы выбрали
            string writePath = @"E:\=NoDel=\Рабочий стол\Новый текстовый документ (3).txt";
    
            UserInfo selectedUserInfo = users.FirstOrDefault(u => u.ID.Contains(SelectedID));
    
            using (StreamWriter sw = new StreamWriter(writePath))
            {
                sw.WriteLine("{");
                sw.WriteLine(selectedUserInfo.ID);
                sw.WriteLine("  {");
                sw.WriteLine(selectedUserInfo.AccountName);
                sw.WriteLine(selectedUserInfo.PersonaName);
                sw.WriteLine(selectedUserInfo.RememberPassword);
                sw.WriteLine(selectedUserInfo.Mostrecent);
                sw.WriteLine(selectedUserInfo.TimeStamp);
                sw.WriteLine("  }");
                sw.WriteLine("}");
            }
    
            Console.ReadLine();
        }
    
        public static UserInfo GetUserInfo(StreamReader sr)
        {
            UserInfo userInfo = new UserInfo
            {
                ID = sr.ReadLine()
            };
    
            sr.ReadLine();
    
            userInfo.AccountName = sr.ReadLine();
            userInfo.PersonaName = sr.ReadLine();
            userInfo.RememberPassword = sr.ReadLine();
            userInfo.Mostrecent = sr.ReadLine();
            userInfo.TimeStamp = sr.ReadLine();
            return userInfo;
        }
    }


    Это если по быстрому. В будущем старайтесь разбивать задачу на подзадачи и гуглить. Все это легко решается с помощью нескольких ссылок и серого вещества.

    Удачи.
    Ответ написан
    1 комментарий
  • В DataGridView появляются лишние строки после применения фильтра TreeView, как исправить?

    SpacePurr
    @SpacePurr
    c#, wpf
    На сколько я понял, лишняя строка, которая появляется - это выделенная строка в CurrencyManager.
    Я смог найти два подхода к решению этой проблемы:
    • Отключить CurrencyManager в начале метода фильтрации по дереву
      CurrencyManager currencyManager = (CurrencyManager)BindingContext [dataGridView1.DataSource];
      currencyManager.SuspendBinding();

      Отключение сделает недоступным некоторые возможности, например CurrentRow, CurrentCell и, возможно, еще что-то.

    • Переключать выделение на одну из строк, которые должны быть видимыми.
      dataGridView1.CurrentCell = this.dataGridView1[columnNumber, visibleRowNumber];

      Однако, этот вариант не работает в случае, когда все строки должны быть скрыты.
    Ответ написан
    Комментировать
  • С какой книги начать изучение С#?

    SpacePurr
    @SpacePurr
    c#, wpf
    1. Лучше начинать с ютуба. Посмотреть глазками как вообще люди работают в Visual Studio.
    2. После изучения на ютубе базовых вещей: циклы, типа, условия, видимость переменных, можно переходить к книге.
    3. Советую Эндрю Троельсен Язык программирования C# 7 и платформы .NET и .Net Core 8-е издание (2018).
    Ответ написан
    Комментировать
  • Таблица Excel в Power Point?

    SpacePurr
    @SpacePurr
    c#, wpf
    Качаете шаблоны надстроек(AddIn) в Visual Studio.
    Создаете проект PowerPoint.
    Подключаете excel в фоне как com объект(var excel = CreateObject("Excel.Application") вроде как). Дальше с этим объектом работаете.
    Думаю дальше справитесь с вместе с гуглом по интересующим вас методам excel.
    Удачи.
    Ответ написан
    5 комментариев
  • Особенности словарей и перебор Arraylist?

    SpacePurr
    @SpacePurr
    c#, wpf
    Доступ осуществляется по ключу, а не по индексу. По аналогии со списком, в словаре можно получить доступ к элементам в цикле по ключам.
    Значения словаря хранятся в неотсортированном порядке, более того, ключи могут храниться не в том порядке, в котором они добавляются.
    По аналогии со списками, словарь может хранить вложенные словари.
    Словари реализованы как хеш-таблицы с быстрым доступом.
    Словари, так же как и списки, хранят ссылки на объекты, а не сами объекты.

    upd
    ArrayList это список, реализованный на основе массива

    На сколько я знаю, в Java цикл foreach для ArrayList будет просто синтаксически удобнее, может быть чуточку быстрее, потому как проверка на ограничения индекса массива производится только один раз в начале.
    Ответ написан
    Комментировать
  • Как переключаться между окнами в WPF с паттерном MVVM?

    SpacePurr
    @SpacePurr
    c#, wpf
    Попробуйте посмотреть здесь Ссылка

    p.s.
    Я сейчас сам изучаю шарп, пишу небольшую программу для работы с Компас 3Д и тоже столкнулся с реализацией открытия новых окон на MVVM, однако ради одного окна я не стал надолго уходить в изучение сервисов навигации и просто создал объект нужного окна в MainViewModel и вызвал у него ShowDialog(), а NewViewModel нового окна привязана к View через DataContext как обычно это делается.
    NewWindow window = new NewWindow();
    window.ShowDialog();

    Для обмена информацией между разными VIewModel использую классы со статическими конструкциями.

    Удачи в изучении.
    Ответ написан
    Комментировать
  • Как изменить фон у button по Click при реализованном новом шаблоне?

    SpacePurr
    @SpacePurr Автор вопроса
    c#, wpf
    Вопрос решен использованием {Binding MyVarName} и реализацией MyVarName переменной в Code Behind с реализованным интерфейсом INotifyPropertyChanged .
    Binding работает как в Border так и в Trigger.
    Все изменяется динамически в процессе работы программы (написал тестовое окно с двум полями, куда вводил HEX цвет, все отлично работает).
    Binding не работает в ColorAnimation. Для передачи цвета в анимацию, аргумент должен быть "замороженным". Однако эта проблема также решаема созданием своего класса Button, наследуемого от FrameworkElement, но для меня это пока дебри.

    Итого:
    1. Реализация линейного градиента
    2. Реализация градиентной зацикленной анимации при наведении
    3. Реализация радиальной заливки при нажатии
    4. Динамическая смена цвета градиента

    XAML:
    <Window x:Class="SxApp.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:SxApp"
            mc:Ignorable="d"
            Title="Aesthetic" Height="450" Width="450">
    
    
        <Window.Background>
            <ImageBrush 
                ImageSource="/SxApp;component/images/bck.jpg" Stretch="UniformToFill"/>
        </Window.Background>
    
    
        <Window.Resources>
            <Color x:Key="vapor_1">#db2525</Color>
            <Color x:Key="vapor_2">#a944ff</Color>
            <Color x:Key="vaporBorder">#8c5791</Color>
            <Color x:Key="vaporLime">#32CD32</Color>
            
            
            <ControlTemplate x:Key="ButtonTemplate"
                             TargetType="Button">
                <Border x:Name="Border"
                        CornerRadius="2000" 
                        TextBlock.Foreground="pink"
                        TextBlock.FontSize="23"
                        TextBlock.FontStyle="Italic"
                        TextBlock.FontWeight="Bold"
                        Margin="10"
                        >
                    <Border.Background >
                        <LinearGradientBrush>
                            <GradientStopCollection>
                                <GradientStop Offset="0" Color="{Binding ButtonColor1}"/>
                                <GradientStop Offset="1" Color="{Binding ButtonColor2}"/>
                            </GradientStopCollection>
                        </LinearGradientBrush>
                    </Border.Background>
    
                    <ContentPresenter
                        RecognizesAccessKey="True"
                        VerticalAlignment="Center"
                        HorizontalAlignment="Center"
                        />
                </Border>
    
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="Border" Property="Background">
                            <Setter.Value>
                                <RadialGradientBrush>
                                    <GradientStop Color="{Binding ButtonPressColor1}" Offset="1" />
                                    <GradientStop Color="{Binding ButtonPressColor2}" Offset="0.2" />
                                </RadialGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
    
                    <EventTrigger RoutedEvent="MouseEnter">
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="Border"
                                                Storyboard.TargetProperty=
                                                "Background.GradientStops[0].Color" 
                                                To="{StaticResource vapor_2}" Duration="0:0:1"
                                                AutoReverse="True"
                                                RepeatBehavior="Forever">
                                </ColorAnimation>
    
                                <ColorAnimation Storyboard.TargetName="Border"
                                                Storyboard.TargetProperty="Background.GradientStops[1].Color" 
                                                To="{StaticResource vapor_1}" Duration="0:0:1"
                                                AutoReverse="True"
                                                RepeatBehavior="Forever">
                                </ColorAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
    
                    <EventTrigger RoutedEvent="MouseLeave">
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="Border"
                                                Storyboard.TargetProperty="Background.GradientStops[0].Color" 
                                                Duration="0:0:1">
                                </ColorAnimation>
    
                                <ColorAnimation Storyboard.TargetName="Border"
                                                Storyboard.TargetProperty="Background.GradientStops[1].Color" 
                                                Duration="0:0:1">
                                </ColorAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Window.Resources>
        
        
        <Grid>
            <Button
                Name="aesButton"
                Click="AesButton_Click"
                Content="Aesthetic"
                Width="200"
                Height="200"
                Template="{StaticResource ButtonTemplate}"/>
        </Grid>
    </Window>


    C#:
    using System;
    using System.ComponentModel;
    using System.Windows;
    
    namespace SxApp
    {
        public partial class MainWindow : Window, INotifyPropertyChanged
        {
            private string buttonColor1;
            public string ButtonColor1
            {
                get => buttonColor1;
                set
                {
                    buttonColor1 = value;
                    OnPropertyChanged("ButtonColor1");
                }
            }
    
            private string buttonColor2;
            public string ButtonColor2
            {
                get => buttonColor2;
                set
                {
                    buttonColor2 = value;
                    OnPropertyChanged("ButtonColor2");
                }
            }
    
            private string buttonPressColor1;
            public string ButtonPressColor1
            {
                get => buttonPressColor1;
                set
                {
                    buttonPressColor1 = value;
                    OnPropertyChanged("ButtonPressColor1");
                }
            }
    
            private string buttonPressColor2;
            public string ButtonPressColor2
            {
                get => buttonPressColor2;
                set
                {
                    buttonPressColor2 = value;
                    OnPropertyChanged("ButtonPressColor2");
                }
            }
    
            public MainWindow()
            {
                InitializeComponent();
                DataContext = this;
                ButtonColor1 = "#db2525";
                ButtonColor2 = "#a944ff";
                ButtonPressColor1 = "#8c5791";
                ButtonPressColor2 = "#32CD32";
            }
    
            private void AesButton_Click(object sender, RoutedEventArgs e)
            {
                string temp = ButtonColor1;
                ButtonColor1 = ButtonColor2;
                ButtonColor2 = temp;
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            public void OnPropertyChanged(string propertyName)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }


    5c5c52d0ec636963645101.png

    Для реализации динамической смены цвета в анимации советовали почитать главу "Рисованные элементы" и "Создание элемента управления лишенного внешнего вида" в книге "Мэтью Мак-Дональд. WPF: Windows Presentation Foundation в .NET 4.0 с примерами на C# 2010 для профессионалов".
    Всем большое спасибо.
    Ответ написан
    Комментировать