Ответы пользователя по тегу C#
  • Как решить ошибку пула соединений к PostgreSql?

    SpacePurr
    @SpacePurr
    c#, wpf
    А что у вас указано в ConnectionString к базе? Может там просто MaxPoolSize у вас стоит в 10 коннектов.
    Ну либо проверить количество доступных соединение в самой базе SHOW max_connections;
    Ответ написан
    Комментировать
  • Механизм работы наследования в C#?

    SpacePurr
    @SpacePurr
    c#, wpf
    1. base - это ключевое слово
    2. Переменным, объявленным в теле класса(поле), автоматически присваивается значение по умолчанию в соответствии с объявленным типом. К свойствам это, естественно, тоже относится.
    Ответ написан
    9 комментариев
  • Как реализовать Data Binding с Rich Text Block?

    SpacePurr
    @SpacePurr
    c#, wpf
    Используйте RichTextBox из wpftoolkit
    Ответ написан
    Комментировать
  • Не срабатывает свойство в WPF. В чём ошибка?

    SpacePurr
    @SpacePurr
    c#, wpf
    Вместо StackPanel используйте DockPanel
    <DockPanel>
         <Label Content="Фамилия:"/>
         <TextBox Width="300" />
    </DockPanel>


    Для StackPanel стиль убирайте, для TextBox оставляйте.
    5e7affefc3b9f806003549.png
    Ответ написан
    1 комментарий
  • Можно ли во ViewModel узнать ширину элемента View?

    SpacePurr
    @SpacePurr
    c#, wpf
    Не знаю насколько это противоречит паттерну, но с ходу пришло такое решение.

    View:
    <Button x:Name="MyButton" Command="{Binding ClickCommand}" 
    CommandParameter="{Binding ElementName=MyButton}"/>


    ViewModel:
    public class MainViewModel : BaseViewModel
    {
        public Command ClickCommand { get; set; }
    
        public MainViewModel()
        {
            ClickCommand = new Command(ClickCommandExecute);
        }
    
        private void ClickCommandExecute(object obj)
        {
            Button button = obj as Button;
            MessageBox.Show(button.ActualHeight.ToString() + " : " + button.ActualWidth);
        }
    }


    Только тсссссс! ViewModel ни слова!
    Ответ написан
    1 комментарий
  • Почему из SelectedItem Listbox я получаю предыдущий выбранный элемент?

    SpacePurr
    @SpacePurr
    c#, wpf
    Я не эксперт, но возможно событие GotFocus срабатывает раньше, чем присваивается значение выделенному элементу SelectedItem.

    Решить можно так.

    Помимо библиотеки interactivity подключите библиотеку interactions:
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:ei ="http://schemas.microsoft.com/expression/2010/interactions"


    Подключение события будет выглядеть вот так:
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="GotFocus">
            <ei:CallMethodAction MethodName="NoteList_GotFocus"
                                 TargetObject="{Binding }"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>


    ViewModel:
    public void NoteList_GotFocus(object sender, RoutedEventArgs e)
    {
        if (e.OriginalSource is ListBoxItem lvi)
        {
            Note note = lvi.DataContext as Note;
            MessageBox.Show(note.Title);
        }
    }


    Доказательство:
    5dfc71a903242851876417.gif
    Ответ написан
    Комментировать
  • Как сделать binding текста из textbox в label?

    SpacePurr
    @SpacePurr
    c#, wpf
    В конструктор второго окна передавайте Text из основного окна и присваивайте нужному Label.
    Например так:
    public partial class SecondWindow: Window
    {
        public SecondWindow(string text)
        {
            InitializeComponent();
            CategoryText.Text = text;
        }
    }


    SecondWindow window = new SecondWindow(CategoryLabel1.Text);


    Если используете MVVM, то передавайте свойство в ViewModel второго окна.
    Ответ написан
  • Как сделать проверку поля у переменной класса object?

    SpacePurr
    @SpacePurr
    c#, wpf
    Попробуйте вот так

    if(CurrentContentVM is WatchNoteVM wnVM && wnVM.WatchNote == deleteNote)
    Ответ написан
    Комментировать
  • Как создать инсталятор для WPF приложения?

    SpacePurr
    @SpacePurr
    c#, wpf
    Не обязательно использовать инсталлятор встроенный.
    Попробуйте Smart Install Maker, достаточно гибкая программа.
    Ответ написан
  • Как перенести метод для кнопок в отдельный класс в WPF?

    SpacePurr
    @SpacePurr
    c#, wpf
    Вам не нужно переносить методы. Просто опишите их в нужном вам классе и вызовите в методах в классе окна.

    Например так:
    public partial class MainWindow : Window
        {
            Animation animation;
    
            bool isOptionsOpen1 = false;
            bool isOptionsOpen2 = false;
    
            public MainWindow()
            {
                InitializeComponent();
                HotKeys hk = new HotKeys(this);
                animation = new Animation(this);
            }               
    
            private void OpenOptions(object sender, RoutedEventArgs e)
            {             
               animation.OpenOptions();
            }
    
            private void HideOptions(object sender, RoutedEventArgs e)
            {           
               animation.HideOptions();
            }
        }
    Ответ написан
  • Прозрачность окон в wpf?

    SpacePurr
    @SpacePurr
    c#, wpf
    Добавьте свойство AllowTransparency = "True" и WindowsStyle = "None"
    <Window x:Class="WpfApp1.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:WpfApp1"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800" Opacity="0.5" AllowsTransparency="True" 
            WindowStyle="None">
    Ответ написан
  • Как деактивировать все toggle button кроме одного при клике?

    SpacePurr
    @SpacePurr
    c#, wpf
    Определите такой стиль
    <Window.Resources>
        <Style TargetType="RadioButton" BasedOn="{StaticResource {x:Type ToggleButton}}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <ToggleButton IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                            Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>


    Теперь просто объявите нужное количество RadioButton
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
    
        <RadioButton Grid.Column="0" Width="50" Height="50" />
        <RadioButton Grid.Column="1" Width="50" Height="50" />
        <RadioButton Grid.Column="2" Width="50" Height="50" />
    </Grid>


    При нажатии на кнопку только она становится активной. При повторном нажатии на нее она становится неактивной.

    5de755219b192060452254.gif

    Также, если вы хотите сделать группы таких кнопок, вам нужно добавить к RadioButton свойство GroupName с именем группы.
    <RadioButton GroupName="Group1"/>
    <RadioButton GroupName="Group1"/>
    <RadioButton GroupName="Group1"/>
    
    <RadioButton GroupName="Group2"/>
    <RadioButton GroupName="Group2"/>
    <RadioButton GroupName="Group2"/>


    Тогда нажатие на кнопку из Group1 никак не будет влиять на кнопки из Group2.
    Ответ написан
    5 комментариев
  • Как получить доступ к главному окну из другого класса в WPF?

    SpacePurr
    @SpacePurr
    c#, wpf
    Передача this в конструктор нового класса.

    class HotKeys
    {
         private MainWindow window;
         //Конструктор
         public HotKeys(MainWIndow _window)
         {
              window = _window;
         }
    }


    namespace Toolkits
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
           
            public MainWindow()
            {
                InitializeComponent();
                HotKeys hk = new HotKeys(this);           
            }
        }
    }
    Ответ написан
    1 комментарий
  • Как вызывать одно и тоже контекстное меню для каждого элемента с одинаковым типом?

    SpacePurr
    @SpacePurr
    c#, wpf
    Возможно вам подойдет такой вариант:
    <Window.Resources>
        <ContextMenu x:Key="MyContextMenu">
            <!--Ваше меню -->
        </ContextMenu>
    </Window.Resources>
    
    <Grid>
         <!-- колонки строки -->
        <TextBox Tag="1" Grid.Column="1" Grid.Row="5" ContextMenu="{StaticResource MyContextMenu}"/>        
        <TextBox Tag="2" Grid.Column="2" Grid.Row="5" ContextMenu="{StaticResource MyContextMenu}"/>                   
    </Grid>
    Ответ написан
    Комментировать
  • Как открыть форму по нажатию на строку в DataGrid?

    SpacePurr
    @SpacePurr
    c#, wpf
    • Создаем колонку, содержимое в ячейках которой будет представлять Button с событием Button_Click.
      <DataGrid Name="MyDataGrid" ItemsSource="{Binding Table}">
          <DataGrid.Columns>
              <DataGridTemplateColumn>
                  <DataGridTemplateColumn.CellTemplate>
                      <DataTemplate>
                          <Button Click="Button_Click">Open Form</Button>
                      </DataTemplate>
                  </DataGridTemplateColumn.CellTemplate>
              </DataGridTemplateColumn>
          </DataGrid.Columns>
      </DataGrid>

    • Пусть имеется некая форма TosterForm, конструктор которой принимает один строковый аргумент - значение в 3 колонке выделенной строки.
      private void Button_Click(object sender, RoutedEventArgs e)
      {
          TosterForm form = new TosterForm(((DataRowView)MyDataGrid.SelectedItem).Row.ItemArray[3].ToString());
          form.ShowDialog();
      }

      По поводу получения значения в ячейке может есть и другой вариант, я до этого практически не работал с DataGrid.


    Собственно, вроде все.
    5dc1d8876549f349153436.gif
    Ответ написан
    Комментировать
  • Как создать собственную библиотеку?

    SpacePurr
    @SpacePurr Автор вопроса
    c#, wpf
    Вопрос не имеет особого смысла. Закрыто)
    Ответ написан
    Комментировать
  • Как удалить выбранную строку в Datagrid?

    SpacePurr
    @SpacePurr
    c#, wpf
    DataTable Table{get; set;}
    DataAdapter dataAdapter;
    
    private void DeleteMethod(object obj)
    {
    
        var indexDataTable= //получаете здесь индекс из колонки "индекс"(например) выбранной строки
        var indexDataGridRow = //тут индекс самой строки, чтобы удалить ее из DataTable, либо вообще DataTable заново получать
    
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = new SqlConnection(connectionString);
            cmd.CommandText = "DELETE FROM YourTableName where id=" + indexDataTable;
    
            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();
        }
    
        Table.Rows[indexDataGridRow].Delete();
        Table.AcceptChanges();
        dataAdapter.Update(Table);
    }
    Ответ написан
    Комментировать
  • Как сделать данную работу на c#?

    SpacePurr
    @SpacePurr
    c#, wpf
    Для примера на WPF.

    После запуска программы в окне изображается две полосы прокрутки.

    Разделим основной Grid на две строки, две колонки. По краям поместим ScrollBar, в большую часть Canvas.
    В Canvas в качестве элементов, которые должны менять позицию, возьмем Button.
    Также добавим обработчики события Button.Click и ScrollBar.Scroll.

    <Window x:Class="Toster.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:Toster"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800" MinWidth="200">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition Height="15"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition Width="15"/>
            </Grid.ColumnDefinitions>
    
            <Canvas Name="Field">
                <Button Canvas.Left="120" Canvas.Top="150" 
                        Height="50" Width="50" Click="Button_Click"/>
                <Button Canvas.Left="250" Canvas.Top="180" 
                        Height="50" Width="50" Click="Button_Click"/>
            </Canvas>
            
            <ScrollBar x:Name="VerticalScrollBar" 
                       HorizontalAlignment="Right" 
                       Grid.Column="1" Grid.Row="0" 
                       Scroll="VerticalScrollBar_Scroll"/>
            <ScrollBar x:Name="HorizontalScrollBar" 
                       Orientation="Horizontal" VerticalAlignment="Bottom" 
                       Grid.Column="0" Grid.Row="1" 
                       Scroll="HorizontalScrollBar_Scroll"/>
        </Grid>
    </Window>


    В основном классе создадим два свойства:
    1. Point SelectedPoint, в которой будут храниться координаты выбранного элемента
    2. Button SelectedButton, которая будет хранить выбранный элемент.

    ScrollBar сделаем неактивными, пока не будут выбраны объекты для перемещения.

    Наводя указатель мыши на одну из двух фигур, можно выбирать, какая из этих фигур связана с полосами прокрутки.

    В событии Button.Click ставим крестик выбранному Button. Сохраняем в свойства SelectedButton и SelectedPoint выбранный элемент и его координаты соответственно.
    Значения свойства Value у ScrollBar заполняем относительным положение Button на Canvas.

    При перемещении полосы прокрутки, создаем новую точку с обратно высчитанными координатами и присваиваем новое положение элемента на Canvas.

    public partial class MainWindow : Window
        {
            public Point SelectedPoint { get; set; }
            public Button SelectedButton { get; set; }
    
            public MainWindow()
            {
                DataContext = this;
                InitializeComponent();
    
                VerticalScrollBar.IsEnabled = false;
                HorizontalScrollBar.IsEnabled = false;
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                if (SelectedButton != null)
                    SelectedButton.Content = "";
    
                SelectedButton = sender as Button;
                SelectedButton.Content = "X";
    
                SelectedPoint = SelectedButton.TransformToAncestor(Field).Transform(new Point(0, 0));
                VerticalScrollBar.Value = SelectedPoint.Y / Field.ActualHeight;
                HorizontalScrollBar.Value = SelectedPoint.X / Field.ActualWidth;
    
                VerticalScrollBar.IsEnabled = true;
                HorizontalScrollBar.IsEnabled = true;
            }
    
            private void VerticalScrollBar_Scroll(object sender, ScrollEventArgs e)
            {
                SelectedPoint = new Point(SelectedPoint.X, VerticalScrollBar.Value * Field.ActualHeight);
                Canvas.SetTop(SelectedButton, SelectedPoint.Y);
            }
    
            private void HorizontalScrollBar_Scroll(object sender, ScrollEventArgs e)
            {
                SelectedPoint = new Point(HorizontalScrollBar.Value * Field.ActualWidth, SelectedPoint.Y);
                Canvas.SetLeft(SelectedButton, SelectedPoint.X);
            }
        }


    Пример простой, непрофессиональный, но рабочий. Остальное в ваших руках :)

    5dbf2c1f1718c377695765.gif
    Ответ написан
    Комментировать
  • C#. Как правильно вместить внешние dll в один exe?

    SpacePurr
    @SpacePurr
    c#, wpf
    Не все dll можно вместить в .exe.
    Однако, попробуйте вот что. Если работаете в студии, то в Обозревателе Решений выберете ваш проект, перейдите в Ссылки. Нажмите на нужную вам ссылку и в свойствах переключите параметр "Внедрить типы взаимодействия" в True.
    5dbed55dc1005875033495.png
    Ответ написан
    9 комментариев