• ИИ, Нейронные сети, ML – для школьника?

    SpacePurr
    @SpacePurr
    h0pper1, это произойдет не так быстро, но с текущим интернетом и доступностью ресурсов в любом случае не окажешься без информации.
    Перспектива у направления есть, амбиции у вас растут, удачи в этом нелегком, но очень интересном пути)
  • Правильная сборка проекта c#?

    SpacePurr
    @SpacePurr Автор вопроса
    freeExec, это понятно, вопрос в том как правильно делать. Каких то определенных рекомендаций и гайдов найти не могу. То ли ищу плохо, то ли все на поверхности лежит, а я копаю.
  • Правильная сборка проекта c#?

    SpacePurr
    @SpacePurr Автор вопроса
    установщик есть, использую SmartInstallMaker
    С версиями разбираюсь
    Логи прикручиваю потихоньку тоже

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

    SpacePurr
    @SpacePurr Автор вопроса
    Foggy Finder, можно не торопиться. Я решил проблему совершенно другом методом и у меня остался чисто академический интерес.
  • Клиент - серверное приложение на Xamarin?

    SpacePurr
    @SpacePurr Автор вопроса
    Владимир Коротенко, хорошо, спасибо. Отмечу решением, верится в решение)
  • Клиент - серверное приложение на Xamarin?

    SpacePurr
    @SpacePurr Автор вопроса
    т.е. с помощью Simple Http Listener PCL на "главном" телефоне я смогу регистрировать подключение других телефонов?
  • Как сделать binding текста из textbox в label?

    SpacePurr
    @SpacePurr
    postya, в общем у меня получилось сделать таким образом, который предложил valerahex

    Я так понимаю, что вы не используете mvvm, но я советую перейти на этот паттерн. Я не самый хороший учитель, поэтому кратко код, а дальше думаю разберемся.

    По структуре проекта:
    При создании WPF проекта у вас появляется класс MainWindow.xaml с вложенным MainWindow.xaml.cs.

    Помимо этого требуется создать класс Command, класс BaseViewModel и класс MainViewModel.

    Команды позволяют привязать действие к элементу окна.
    public class Command : ICommand
        {
            Action<object> execute;
            private Func<object, bool> canExecute;
    
            public Command(Action<object> execute, Func<object, bool> canExecute = null)
            {
                this.execute = execute;
                this.canExecute = canExecute;
            }
    
            public event EventHandler CanExecuteChanged
            {
                add { CommandManager.RequerySuggested += value; }
                remove { CommandManager.RequerySuggested -= value; }
            }
    
            public bool CanExecute(object parameter)
            {
                return this.canExecute == null || this.canExecute(parameter);
            }
    
            public void Execute(object parameter)
            {
                execute(parameter);
            }
        }


    BaseViewModel - это класс, который реализует интерфейс INotifyPropertyChanged, который уведомляет окно об изменении привязанного значения.
    public class BaseViewModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            public void OnPropertyChanged([CallerMemberName] string property = null)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
            }
        }


    MainViewModel - это класс, который связывает логику приложения с окном. Если проще, то этот класс будет использоваться вместо того, где происходила инициализация формы(InitializeComponent()). Также в нем нам нужно унаследоваться от класса BaseViewModel.
    public class MainViewModel : BaseViewModel
        {
    
            private string mainWindowText;
            public string MainWindowText { get => mainWindowText; set { mainWindowText = value; OnPropertyChanged(); } }
    
            public Command OpenSecondWindow { get; set; }
    
    
            public MainViewModel()
            {
                OpenSecondWindow = new Command(OpenSecondWIndowExecute);
            }
    
            private void OpenSecondWIndowExecute(object obj)
            {
                SecondWindow secondWindow = new SecondWindow(this);
                secondWindow.ShowDialog();
            }
        }

    В этом классе мы реализовали свойство типа string, которое привяжем к TextBox главного и второстепенного окна, а также команду, которая будет привязана к кнопке открытия второстепенного окна.

    Теперь перейдем к нашим xaml.

    MainWindow.xaml

    <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="300" Width="500" >
        <Window.DataContext>
            <local:MainViewModel/>
        </Window.DataContext>
        <Grid>
            <StackPanel>
                <TextBlock FontSize="30" Text="Первое окно" HorizontalAlignment="Center"/>
                <TextBox FontSize="30" Text="{Binding MainWindowText,UpdateSourceTrigger=PropertyChanged}" Width="200" Height="45"/>
                <TextBlock/>
                <Button Content="Открыть второе окно" Height="20" Width="130" Command="{Binding OpenSecondWindow}"/>
            </StackPanel>
        </Grid>
    </Window>


    Здесь мы видим, что DataContext окна привязывается к классу MainViewModel. К свойству Text нашего TextBox привязывается свойство MainWindowText, а к элементу Button привязывается команда OpenSecondWindow, которая будет срабатывать при клике на кнопку.

    SecondWIndow.xaml
    <Window x:Class="WpfApp1.SecondWindow"
            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="SecondWindow" Height="300" Width="400">
        
        <Grid>
            <StackPanel>
                <TextBlock FontSize="30" Text="Второе окно" HorizontalAlignment="Center"/>
                <TextBox  FontSize="30" Text="{Binding MainWindowText, UpdateSourceTrigger=PropertyChanged}" Width="200" Height="45"/>
            </StackPanel>
        </Grid>
    </Window>

    Здесь аналогичным образом привязывается свойство MainWIndowText к свойству Text.

    Однако, помимо этого, мы должны передать экземпляр класса MainViewModel в конструктор второго окна и привязать его к DataContext. Если вернуться к реализации класса MainViewModel, можно заметить, что при создании объекта окна SecondWindow в его конструктор передается параметр this.

    Переходим в класс SecondWindow.xaml.cs
    public partial class SecondWindow : Window
        {
            public SecondWindow(MainViewModel mvm)
            {
                DataContext = mvm;
                InitializeComponent();
            }
        }


    Собственно, вот и все.
    Если поначалу кажется запутанно, то, во первых - привыкнете и вам это очень понравится, а во вторых я не самый лучший учитель.
    Поэтому вот ссылка на metanit

    Гифка с результатом.
    5df40d81edd2e268104979.gif
  • Как сделать binding текста из textbox в label?

    SpacePurr
    @SpacePurr
    postya, ой, извиняюсь, вопроса не понял)
    Сейчас напишу как можно сделать
  • Как перенести метод для кнопок в отдельный класс в WPF?

    SpacePurr
    @SpacePurr
    Foggy Finder, я сейчас прочитал ещё немного про обобщения и, видимо, указывать всегда только Action object ведет к упаковке и распаковке, а при реализации обобщения мы делаем процесс производительнее.

    А про SetProperty вспомнил, что видел его где то в ваших ответах. Нашёл, посмотрел, понял.

    Спасибо)
  • Как перенести метод для кнопок в отдельный класс в WPF?

    SpacePurr
    @SpacePurr
    Foggy Finder, достаточно тяжело с ходу понять mvvm, а в контексте данного вопроса показалось логичным дать именно такой ответ. Для небольших программ такой подход вполне приемлем. Наверное)
  • Как перенести метод для кнопок в отдельный класс в WPF?

    SpacePurr
    @SpacePurr
    После просмотра этого кода, сложилось впечатление, что я mvvm использую по деревенски. Если можно, хотелось бы уточнить кое что.

    Не пойму назначение этих строк, всегда писал команду без них.
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }


    А также, зачем создавать команду с обощением T и при создании указывать массив object[]. Я обычно делал просто object.

    И последний момент по методу SetProperty. Тоже всегда обходился без него и первый раз вижу его в реализации команды.

    Ожидаю открытия третьего мввмного глаза и насыщения знаниями)
    Спасибо.
  • Прозрачность окон в wpf?

    SpacePurr
    @SpacePurr
    crescent, ну на это условия не было. Но вы можете реализовать окно сами. Например вот так.

    <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" ResizeMode="CanResizeWithGrip">
    
        <Window.Resources>
            <Style x:Key="MaxButtonStyle" TargetType="{x:Type Button}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border  BorderBrush="#535666" BorderThickness="2,5,2,2" Width="20" Background="White" Margin="2"/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
            <Style x:Key="MinButtonStyle" TargetType="{x:Type Button}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border  Width="20" Height="7"  BorderBrush="#535666" BorderThickness="2" Background="#FFFFFF"/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
    
            <Style x:Key="CloseButtonStyle" TargetType="{x:Type Button}">
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="Foreground" Value="#535666"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border  Width="20"  BorderBrush="#535666"  Background="#FFFFFF" Margin="2">
                                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="20"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <Grid Grid.Row="0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="90"/>
                </Grid.ColumnDefinitions>
    
                <Border Grid.ColumnSpan="2" MouseLeftButtonDown="Border_MouseLeftButtonDown" Background="Black">
                    
                </Border>
                <StackPanel Grid.Column="1" Orientation="Horizontal">
                    <Button Width="30" Height="20" Style="{StaticResource MinButtonStyle}" Click="Button_Click"/>
                    <Button Width="30" Height="20" Style="{StaticResource MaxButtonStyle}" Click="Button_Click_1"/>
                    <Button Width="30" Height="20" Style="{StaticResource CloseButtonStyle}" Content="X" Click="Button_Click_2"/>
                </StackPanel>
            </Grid>
        </Grid>
    </Window>


    CodeBehind
    using System.Windows;
    using System.Windows.Input;
    
    namespace WpfApp1
    {
        /// <summary>
        /// Логика взаимодействия для MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public double LastWidth { get; set; }
            public double LastHeight { get; set; }
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                DragMove();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                WindowState = WindowState.Minimized;
            }
    
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                if (WindowState != WindowState.Maximized)
                    WindowState = WindowState.Maximized;
                else
                    WindowState = WindowState.Normal;
            }
    
            private void Button_Click_2(object sender, RoutedEventArgs e)
            {
                Close();
            }
        }
    }
  • C#. Как правильно вместить внешние dll в один exe?

    SpacePurr
    @SpacePurr
    Foggy Finder, каким то образом я вспомнил про это диалог с dll.

    Есть у меня библиотека с ActiveX контролами одной системы, допустим ControlsLib.

    Когда я добавляю контрол из списка предложенного Visual Studio при добавлении новых элементов управления, то студия сама формирует новую библиотеку по типа Ax{какое_то_свое_имя} и добавляет и ее и оригинальную библиотеку ControlsLib в ссылки проекта.
    После этого, при попытке выставить параметр "внедрить типы взаимодействия" в true, студия выдает ошибку.
    Таким образом, если я использую ActiveX элемент управления, то обе библиотеки должны находится рядом с моим исполняемым файлом.
  • Как деактивировать все toggle button кроме одного при клике?

    SpacePurr
    @SpacePurr
    postya, вроде нужно переопределить стиль кнопки и создать trigger в control template на изменение IsEnabled и там менять цвет. Создавайте новый вопрос - глядишь и решение найдется)