Ответы пользователя по тегу WPF
  • Почему не меняется свойство Background в ListViewItem?

    Надо бодяжить ControlTemplate. Не знаю, почему. Но напрямую это либо не работает, либо работает не так, как кажется.
    Дам вам свой укороченный пример:
    <Style TargetType="ListViewItem">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="local:Properties.IsStatus" Value="{Binding IsStatus, Mode=OneWay}" />
        <Setter Property="local:Properties.IsConnection" Value="{Binding IsConnection, Mode=OneWay}" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <Border
                        x:Name="Border"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}">
                        <ContentPresenter
                            x:Name="Content"
                            Margin="0,0,0,0"
                            TextBlock.Foreground="{TemplateBinding Foreground}"
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Stretch" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    
        <Style.Triggers>
    
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="local:Properties.IsStatus" Value="0" />
                    <Condition Property="local:Properties.IsConnection" Value="True" />
                </MultiTrigger.Conditions>
                <MultiTrigger.Setters>
                    <!--  Красный  -->
                    <Setter Property="Background" Value="#FFFFCDD2" />
                    <Setter Property="Foreground" Value="#FFB71C1C" />
                    <Setter Property="BorderBrush" Value="#00D32F2F" />
                </MultiTrigger.Setters>
            </MultiTrigger>
    
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="local:Properties.IsStatus" Value="9" />
                    <Condition Property="local:Properties.IsConnection" Value="True" />
                </MultiTrigger.Conditions>
                <MultiTrigger.Setters>
                    <!--  Серый  -->
                    <Setter Property="Background" Value="#FFF5F5F5" />
                    <Setter Property="Foreground" Value="#FF212121" />
                    <Setter Property="BorderBrush" Value="#00616161" />
                </MultiTrigger.Setters>
            </MultiTrigger>
    
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="#FFFFE0B2" />
                <Setter Property="Foreground" Value="#FFE65100" />
            </Trigger>
    
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsSelected" Value="False" />
                    <Condition Property="local:Properties.IsConnection" Value="False" />
                </MultiTrigger.Conditions>
                <MultiTrigger.Setters>
                    <Setter Property="Background" Value="#FFFFFFFF" />
                    <Setter Property="Foreground" Value="#FF000000" />
                    <Setter Property="BorderBrush" Value="#00000000" />
                </MultiTrigger.Setters>
            </MultiTrigger>
    
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="#FFE8EAF6" />
                <Setter Property="Foreground" Value="#FF1A237E" />
            </Trigger>
        </Style.Triggers>
    </Style>
    Ответ написан
    1 комментарий
  • Как заставить заработать триггеры в ListViewItem?

    @AquariusStar Автор вопроса
    Решил проблему. Оказалось, в попытках решить вопрос с шаблонами данных отключил словарь ресурса временно в App.xaml, который и ссылался на этот стиль. А затем и забыл про него. Поэтому и не работало всё. Теперь полностью заработало как надо.
    Ответ написан
    Комментировать
  • Как правильно реализовать привязку между элементами и массивами?

    @AquariusStar Автор вопроса
    Проблема решилась.
    Надо было исправить:
    <ContentControl Grid.Row="1" Name="Channel_1" Content="{Binding ControlChannelDevice[0]}"/>
    <ContentControl Grid.Row="1" Name="Channel_2" Content="{Binding ControlChannelDevice[1]}"/>
    <ContentControl Grid.Row="1" Name="Channel_3" Content="{Binding ControlChannelDevice[2]}"/>
    <ContentControl Grid.Row="1" Name="Channel_4" Content="{Binding ControlChannelDevice[3]}"/>

    и:
    Channel_1.DataContext = ControlChannelsDevice;
    Channel_2.DataContext = ControlChannelsDevice;
    Channel_3.DataContext = ControlChannelsDevice;
    Channel_4.DataContext = ControlChannelsDevice;
    Ответ написан
    Комментировать
  • Как связать свойства Label из DataTemplate с Template Style?

    @AquariusStar Автор вопроса
    Решение найдено:
    <DataTemplate x:Key="SelectContext">
            <Border x:Name="Data">
                <Grid x:Name="ContentBase" Margin="1,0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Label
                        Grid.Column="0"
                        Margin="0"
                        Padding="0"
                        HorizontalAlignment="Left"
                        Content="{Binding Content, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentPresenter}}"
                        Foreground="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentPresenter}}" />
                    <RadioButton
                        Name="_1"
                        Grid.Column="1"
                        Content="1"
                        Style="{StaticResource RadioButtonKeys}" />
                    <RadioButton
                        Name="_2"
                        Grid.Column="2"
                        Content="2"
                        Style="{StaticResource RadioButtonKeys}" />
                    <RadioButton
                        Name="_3"
                        Grid.Column="3"
                        Content="3"
                        Style="{StaticResource RadioButtonKeys}" />
                </Grid>
            </Border>
        </DataTemplate>

    Надо заменить с
    Foreground="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentPresenter}}"
    на
    Foreground="{Binding Foreground, RelativeSource={RelativeSource Mode=Self}}"
    Ответ написан
    Комментировать
  • Как получить новое значение при смене указателя в радиокнопке, а не старое?

    @AquariusStar Автор вопроса
    Нашёл решение в рамках данного вопроса. Оказывается, есть определённый нюанс следования событий.

    <!--  ListBoxItem  -->
        <Style x:Key="Item"
               BasedOn="{x:Null}"
               TargetType="{x:Type ListBoxItem}">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="VerticalContentAlignment" Value="Stretch"/>
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="Height" Value="42"/>
            <Setter Property="Margin" Value="-2,0,0,0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <Grid x:Name="ListItem">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock x:Name="ListItem_Text"
                                       Grid.Column="0"
                                       Padding="10,0"
                                       HorizontalAlignment="Left"
                                       VerticalAlignment="Center"
                                       FontSize="13"
                                       FontWeight="Medium"
                                       Foreground="{TemplateBinding Foreground}"
                                       Text="{TemplateBinding Content}"/>
                            <RadioButton x:Name="PART_SelectVariable_1"
                                         Grid.Column="1"
                                         Content="Вариант 1"
                                         IsEnabled="{TemplateBinding IsEnabled}"
                                         Style="{StaticResource {x:Type ToggleButton}}"/>
                            <RadioButton x:Name="PART_SelectVariable_2"
                                         Grid.Column="2"
                                         Content="Вариант 2"
                                         IsEnabled="{TemplateBinding IsEnabled}"
                                         Style="{StaticResource {x:Type ToggleButton}}"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="ListItem" Property="Background" Value="#FF203FE6"/>
                                <Setter TargetName="ListItem_Text" Property="Foreground" Value="White"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter TargetName="ListItem" Property="Background" Value="LightGray"/>
                                <Setter TargetName="ListItem_Text" Property="Foreground" Value="DarkGray"/>
                            </Trigger>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter TargetName="ListItem" Property="Background" Value="#FFFDDFAD"/>
                                <Setter TargetName="ListItem_Text" Property="Foreground" Value="#FFA47C38"/>
                            </Trigger>
                            <Trigger Property="local:Styles.IsRadioButton" Value="-1">
                                <Setter Property="DataContext" Value="0"/>
                                <Setter TargetName="PART_SelectVariable_1" Property="IsChecked" Value="false"/>
                                <Setter TargetName="PART_SelectVariable_2" Property="IsChecked" Value="false"/>
                            </Trigger>
                            <DataTrigger Binding="{Binding ElementName=PART_SelectVariable_1, Path=IsPressed}"
                                         Value="True">
                                <Setter TargetName="ListItem" Property="Background" Value="#FFE8E9F2"/>
                                <Setter TargetName="ListItem_Text" Property="Foreground" Value="#FF9A9FB8"/>
                                <Setter Property="local:Styles.IsRadioButton" Value="1"/>
                                <Setter Property="IsSelected" Value="True"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding ElementName=PART_SelectVariable_2, Path=IsPressed}"
                                         Value="True">
                                <Setter TargetName="ListItem" Property="Background" Value="#FFE8E9F2"/>
                                <Setter TargetName="ListItem_Text" Property="Foreground" Value="#FF9A9FB8"/>
                                <Setter Property="local:Styles.IsRadioButton" Value="2"/>
                                <Setter Property="IsSelected" Value="True"/>
                            </DataTrigger>
    
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>


    Если засунуть local:PeakHelper.IsRadioButton в триггер IsChecked, а вызывать смену активного указателя SelectedIndex в IsPressed, то данные буду получать старые. А надо было сразу всё в IsPressed.
    Так как IsPressed по следованию событий идёт первым, а вторым - уже IsChecked.
    Ответ написан
    Комментировать
  • Какие технологии .NET стоит изучать сейчас?

    WPF нисколько не умирает. Это какие-то странные слухи. Например, в последней версии .NET Framework 4.7 включили обновления для WPF, и он достаточно внушительный. И он будет развиваться и дальше. UWP (у него такой же язык, что и у WPF: XAML) обычно завязан на магазине Microsoft и требует только последние версии Windows, насколько я помню. Ещё до сих пор существует WinForm, и он не собирается пока сдавать свои позиции. Если вам нравится этот язык, то работайте с ними, осваивайте новое. Изучать всё сразу не получится, слишком большой охват. Лучше изучать по ходу дела. Я именно так поступаю. Когда нужно новое или оптимальное решение, то ищу его. Главное, тут набить руку в программировании. WPF и ASP.NET MVC - разные направления. Первые нацелены на настольные решения, а вторые - уже веб-решения. А уж дальше уже зависит от поставленных задач.
    Ответ написан
    2 комментария
  • WPF бесперспективный?

    Microsoft нисколько не отказалась от WPF. У вас какое-то неправильное впечатление. WPF, UWP и прочие практически пишутся на одном и том же языке: XAML. Вот что отличает их старого WinForms. И они очень активно развиваются. А WinForms как раз уже оказывается на обочине развития. Например, WinForms не поддерживает дисплеи с повышенной плотностью пикселей (более 96 пикселей на дюйм). То, что портируется WinForms на другие платформы, это объясняется старостью API Win32, которые уже много лет не меняются. Есть ещё серьёзное ограничение для WinForms, при сложном интерфейсе программа становится заметно тяжёлой. Это объясняется, что делается на обычном процессоре, в отличие от WPF, UWP и прочие. А возможность портирования зависит от прихоти Microsoft. Кстати, в последних сборках Windows 10 уже начнут блокировать приложения старого типа. Это пока будет опционально. На намёк дан, что WinForms умрёт, и очень скоро.
    Ответ написан
    2 комментария
  • Как правильно хранить и использовть стили в WPF?

    Ну я для стилей выделяю в отдельный файл или файлов (если требуются разнообразные варианты). Можно, конечно, сразу в основном файле. Но это для меня оказалось непрактичным делом и затрудняет перенос на другой проект, когда мне нужен один и тот же стиль в рамках какого-то проекта. И к тому же, когда все стили хранятся в отдельном файле, уже всегда знаешь, где его искать и внести пару правок, если что-то не понравилось.
    Ответ написан
    Комментировать
  • Как обратиться к объекту, вызвавшему событие?

    Обычно тащим данные из sender'а. То есть ((Button)sender).Content. Только он возвращает по-умолчанию тип string.
    Ответ написан
    4 комментария
  • Извлечение элемента ComboBox в WPF?

    MessageBox.Show($"{((ComboBoxItem)((ComboBox)sender).SelectedItem).Content}");
    Для TextBlock:
    MessageBox.Show($"{((TextBlock)((ComboBox)sender).SelectedItem).Text}");

    Обновлено:
    Если нужно вытащить данные Run из TextBlock, то используем Inlines.
    MessageBox.Show($"{((Run)((TextBlock)((ComboBox)sender).SelectedItem).Inlines.ElementAt(0)).Text}");
    Ответ написан
    4 комментария
  • Как вытащить конкретные данные в TemplateBinding?

    @AquariusStar Автор вопроса
    Отвечу на свой вопрос. Решение: Binding Path=Content.Port, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}
    Ответ написан
    Комментировать
  • Как при наведении курсора на UserControl изменить свойства элементов внутри её?

    @AquariusStar Автор вопроса
    Проблема решилась. Оказалось, что ошибка типов в классе DependencyObject. А решение: вышеприведённый код.
    Ответ написан
    Комментировать