Ответы пользователя по тегу WPF
  • Как реализовать автоматическое обновление данных таблицы DataGrid в WPF при изменении свойств?

    @Ksarrik
    У вас опечатка:
    public int Age
            {
                get { return age; }
                set
                {
                    age = value;
                    OnPropertyChanged("Price");
                }
            }

    исправьте на
    public int Age
            {
                get { return age; }
                set
                {
                    age = value;
                    OnPropertyChanged("Age");
                }
            }
    Ответ написан
  • Как из Application обратиться к открытому окну?

    @Ksarrik
    В классе Application есть свойство Windows https://docs.microsoft.com/ru-ru/dotnet/api/system...
    из него можно получить нужное окно и вывести результат присвоив свойство Text в TextBlock
    Ответ написан
    Комментировать
  • Как отслеживать нажатие сразу нескольких клавиш WPF?

    @Ksarrik
    private void Window_KeyDown(object sender, KeyEventArgs e)
            {
                if(Keyboard.IsKeyDown(Key.Left) && Keyboard.IsKeyDown(Key.Down))
                {
                    MessageBox.Show("Нажаты клавиши вниз и влево");
                }
            }
    Ответ написан
    Комментировать
  • Как указать путь до файла во встроенных ресурсах WPF?

    @Ksarrik
    Добрый день.
    В вашем примере вы использовали не WPF ресурс
    доступ к нему можно получить доступ как к свойству (в моем случае используется ресурс с именем Data_XMLFile):
    string res=Properties.Resources.Data_XMLFile;
    XmlReader xml2 = XmlReader.Create(new StringReader(res));


    Если же вы хотите использовать WPF ресурс, тогда нужно выбрать этот файл xml и установить действие при сборке в Resource
    61c74b4dcdc71094191470.png
    Затем доступ к ресурсу можно получить следующим образом:
    Uri uri = new Uri("pack://application:,,,/Resources/Data_XMLFile.xml", UriKind.Absolute);
    StreamResourceInfo info = Application.GetResourceStream(uri);            
    XmlReader xml = XmlReader.Create(info.Stream);
    Ответ написан
    Комментировать
  • Как связать ObservableCollection и INotifyCollectionChanged?

    @Ksarrik
    В вашем случае для отображения списка Employee достаточно привязать коллекцию ObservableCollection к элементу списка WPF. ObservableCollection уже реализовывает интерфейсы INotifyCollectionChanged и NotifyPropertyChanged, Поэтому никакой дополнительной увязки не требуетсяhttps://docs.microsoft.com/ru-ru/dotnet/api/system.collect...
    ObservableCollection можно использовать в чистом виде
    А вот если хотите чтобы при изменении свойств класса Employee в интерфейсе обновлялась информация тогда нужно в классе Employee реализовать интерфейс NotifyPropertyChanged.
    В вашем случае чтобы увязать ViewModel с WPF достаточно привязать коллекцию к спискам:
    <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" Loaded="Window_Loaded" >
        <Grid>
            <ListBox x:Name="listbox1" DisplayMemberPath="Name">
                </ListBox>
        </Grid>
    </Window>


    public partial class MainWindow : Window
        {
            private MainViewModel viewModel = new MainViewModel();
    
    
            public MainWindow()
            {
                InitializeComponent();
                //добавляем сотрудников
                viewModel.Employees.Add(new Employee() {Name="Иванов Иван" });
                viewModel.Employees.Add(new Employee() { Name = "Петров Петр" });
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                //привязываем viewModel (необязательно для отображения списка)
                this.DataContext = viewModel;
    
                //привязываем коллекцию
                this.listbox1.ItemsSource = viewModel.Employees;
            }
        }


    61838d6849b9a243115942.png
    Класс Tree в случае реализации необходимых интерфейсов можно использовать вместо класса ObservableCollection.

    Подробнее можете посмотреть здесь https://metanit.com/sharp/wpf/22.2.php
    Ответ написан
    Комментировать
  • Как изменить цвет кнопки в зависимости от триггера?

    @Ksarrik
    Добрый день. Вам вероятно нужно создать шаблон кнопки. Вот пример сделанный на основе книги Мэтью Мак-Дональда
    <Window.Resources>
            <!--шаблон кнопки-->
            <ControlTemplate x:Key="buttonTemplate1" TargetType="{x:Type Button}">         
                <Border Name="border" BorderBrush="Black" BorderThickness="1" CornerRadius="0" Background="Red"  TextBlock.Foreground="Black">
                    <Grid>
                        <Rectangle Name="focusCue" Visibility="Hidden" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2" SnapsToDevicePixels="True"></Rectangle>
                        <ContentPresenter Margin="{TemplateBinding Padding}" HorizontalAlignment="Center"  RecognizesAccessKey="True"></ContentPresenter>
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>              
                    <EventTrigger RoutedEvent="MouseEnter">
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="border" Storyboard.TargetProperty="Background.Color" To="Purple" >
                                </ColorAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="MouseLeave">
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="border" Storyboard.TargetProperty="Background.Color" >
                                </ColorAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <Trigger Property="IsPressed" Value="true">
                        <Setter TargetName="border" Property="Background" Value="IndianRed"></Setter>
                        <Setter TargetName="border" Property="BorderBrush" Value="DarkKhaki"></Setter>
                    </Trigger>
                    <Trigger Property="IsFocused" Value="true">
                        <Setter TargetName="focusCue" Property="Visibility" Value="Visible"></Setter>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter TargetName="border" Property="TextBlock.Foreground" Value="Gray"></Setter>
                        <Setter TargetName="border" Property="Background" Value="MistyRose"></Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
            <Style x:Key="newButtonStyle" TargetType="Button">
                <Setter Property="Control.Template" Value="{StaticResource buttonTemplate1}"></Setter>
            </Style>
        </Window.Resources>
        <StackPanel>      
            <Button Height="30" Width="100" Margin="10" Style="{StaticResource newButtonStyle}">            
            </Button>
        </StackPanel>
    Ответ написан
    3 комментария
  • Как установить заставку в WPF в Visual Studio Community 2015?

    @Ksarrik Автор вопроса
    Проблема решена, вопрос закрыт, всем спасибо)
    Ответ написан