• Как заставить заработать триггеры в ListViewItem?

    @AquariusStar Автор вопроса
    Я пробовал уже в варианте UserControl, ItemsControl и даже просто Border вместо ListViewItem. Всё равно не работает. Перенос триггеров прямо в DataTemplate срабатывает частично. Так как IsSelected не работает почему-то.
  • Как перевести все данные в главный поток для вывода отчёта?

    @AquariusStar Автор вопроса
    А invoke я должен добавить в свой класс ReportEngine как-то? Просто у него нет диспетчера.
    Сам класс состоит из свойства FlowDocument ReportData, который привязывается при инициализации к WPF-объекту VisualSpaceReport.Document, и методов для работы с ReportData.
    А если добавить вот такую конструкцию для вызова, то получается так:
    Dispatcher.Invoke((System.Windows.Forms.MethodInvoker)delegate 
    {
        UI.UI_ControlViewer.UI_Viewer.UI_Report.AddLog((sender as Libraries.Events).Value, e.PropertyName);
    });

    Но вывалится исключение:
    System.InvalidOperationException: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."
  • Почему скорость записи на флешку такая низкая?

    Asparagales, используется файловая система exFAT. Она тоже реализована специально для флешек и поддерживает файлы больше 4 ГБ.
    P.S. И она является основной файловой системой по-умолчанию всех современных флешек.
  • Почему скорость записи на флешку такая низкая?

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

    @AquariusStar Автор вопроса
    FoggyFinder, да, такой способ полезен. Как-то не додумался применить для него также, как с кнопками сделал. Правда, пришлось создать отдельный класс как IntToVisibilityConverter. Реализация успешно работает. А касательно применения стандартного класса от Microsoft, его что-то не видно в коде XAML (отсутствует пространство имён System.Windows.Controls), хоть и доступен в коде C#.
    Вообще-то, ранее пытался переделать TabControl под свои задачи. Но не вышло: слишком мудреная конструкция у него. Пришлось пока состряпать свой вариант на шаблонах данных.
  • Как правильно реализовать привязку между элементами и массивами?

    @AquariusStar Автор вопроса
    FoggyFinder, реализовал это:
    <ItemsControl ItemsSource="{Binding Channels}" Grid.Row="1"/>

    Работает, но выдаёт целый список. А мне надо отображение только выбранного элемента согласно Channel. То есть Channel - это SelectedIndex для Channels по сути.
  • Как правильно реализовать привязку между элементами и массивами?

    @AquariusStar Автор вопроса
    FoggyFinder, DataTemplate у меня больше не использует ключ. Только DataType. При использовании ItemsControl потребовал у меня создать ключ. Я это сделал. Только я не понял, как его применить в следующей конструкции:

    <DataTemplate DataType="{x:Type control:ControlPanel}">
            <DataTemplate.Resources>
                <local:IntToBooleanConverter x:Key="IntToBoolConverter" />
            </DataTemplate.Resources>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="34" />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Grid Grid.Row="0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <RadioButton
                        Name="ChannelButton_1"
                        Grid.Column="0"
                        Content="1"
                        IsChecked="{Binding Channel, Converter={StaticResource IntToBoolConverter}, ConverterParameter=0}" />
                    <RadioButton
                        Name="ChannelButton_2"
                        Grid.Column="1"
                        Content="2"
                        IsChecked="{Binding Channel, Converter={StaticResource IntToBoolConverter}, ConverterParameter=1}" />
                    <RadioButton
                        Name="ChannelButton_3"
                        Grid.Column="2"
                        Content="3"
                        IsChecked="{Binding Channel, Converter={StaticResource IntToBoolConverter}, ConverterParameter=2}" />
                    <RadioButton
                        Name="ChannelButton_4"
                        Grid.Column="3"
                        Content="4"
                        IsChecked="{Binding Channel, Converter={StaticResource IntToBoolConverter}, ConverterParameter=3}" />
                </Grid>
                
                <ContentControl
                    Name="Channel_1"
                    Grid.Row="1"
                    Content="{Binding Channels[0]}" />
                <ContentControl
                    Name="Channel_2"
                    Grid.Row="1"
                    Content="{Binding Channels[1]}" />
                <ContentControl
                    Name="Channel_3"
                    Grid.Row="1"
                    Content="{Binding Channels[2]}" />
                <ContentControl
                    Name="Channel_4"
                    Grid.Row="1"
                    Content="{Binding Channels[3]}" />
            </Grid>
            <DataTemplate.Triggers>
                <Trigger SourceName="ChannelButton_1" Property="IsChecked" Value="True">
                    <Setter TargetName="Channel_1" Property="Visibility" Value="Visible" />
                </Trigger>
                <Trigger SourceName="ChannelButton_1" Property="IsChecked" Value="False">
                    <Setter TargetName="Channel_1" Property="Visibility" Value="Collapsed" />
                </Trigger>
                <Trigger SourceName="ChannelButton_2" Property="IsChecked" Value="True">
                    <Setter TargetName="Channel_2" Property="Visibility" Value="Visible" />
                </Trigger>
                <Trigger SourceName="ChannelButton_2" Property="IsChecked" Value="False">
                    <Setter TargetName="Channel_2" Property="Visibility" Value="Collapsed" />
                </Trigger>
                <Trigger SourceName="ChannelButton_3" Property="IsChecked" Value="True">
                    <Setter TargetName="Channel_3" Property="Visibility" Value="Visible" />
                </Trigger>
                <Trigger SourceName="ChannelButton_3" Property="IsChecked" Value="False">
                    <Setter TargetName="Channel_3" Property="Visibility" Value="Collapsed" />
                </Trigger>
                <Trigger SourceName="ChannelButton_4" Property="IsChecked" Value="True">
                    <Setter TargetName="Channel_4" Property="Visibility" Value="Visible" />
                </Trigger>
                <Trigger SourceName="ChannelButton_4" Property="IsChecked" Value="False">
                    <Setter TargetName="Channel_4" Property="Visibility" Value="Collapsed" />
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>


    Как переделать ContentControl так, чтобы они принимали ItemsControl? Channels - это тот самый DataType ControlDevice. Channel - это просто делает видимым только один из списка.
  • Property и Fields?

    Мне кажется, что в любом случае будет выделяться память. Просто в зависимости от реализации будет по-разному выделяться память. После нескольких лет работы на C# у меня сложилось впечатление, что свойства ведут себя как указатели на хранимое место в памяти с дополнительными действиями.
    Но если вы поискали ответ на свой вопрос на Тостере, то могли бы найти ответ:
    Свойство — это член, предоставляющий гибкий механизм для чтения, записи или вычисления значения частного поля. Свойства можно использовать, как если бы они были членами общих данных, но фактически они представляют собой специальные методы, называемые методами доступа. Это позволяет легко получать доступ к данным и помогает повысить безопасность и гибкость методов. (Свойства MSDN)
  • Какую книгу купить чтобы изучить самые азы C#?

    Есть веб-ресурс: metanit.ru. Там самых основ будет достаточно. А книжный вариант покупать можно, но смысла мало. Потом будете думать, куда девать старые книги. Именно с этим я столкнулся. Поскольку C# развивается стремительно, то книги быстро теряют актуальность, так как они не учитывают новые технологии, которые появятся после выпуска самих книг. А веб-ресурс обновляется с каждым появлением новой технологии в C#.
  • Где найти нормальные курсы по C#?

    Для Linux есть же. Называется .NET Core. От Microsoft. Недавно Microsoft уже обещала графические интерфейсы на Linux. По крайней мере пока не сейчас. Но всё же открыла исходные коды для WPF. Так что стороннему проекту Avalonia станет легче. В общем и в целом, для Linux уже есть возможность программировать на C#.
  • Как писать любые символы через юникод?

    У вас работает Юникод UTF-8. А он так и должен работать. Английские буквы имеют один байт, символы из других языков уже два байта и более. Они имеют переменную длину. Если вам надо жёсткая привязка к длине, то выбираете UTF-16/UTF-32 с BE/LE.
  • Хватит ли мне блока питания?

    Это шутка какая-то? На коробках видеокарт обычно пишут рекомендованный минимум к блоку питания. Обычно видеокарты такого класса требуют как минимум 650 Вт. Но лучше 700-750 Вт. А ещё у вас Xeon явно не холодный. Или вы хотите побыстрее отправить блок питания на тот свет вместе с остальными компонентами? Поэтому общая рекомендация: 700-800 Вт. Так как у меня в компьютере работает видеокарта Radeon HD7850, то на коробке к видеокарте я видел минимальные требования к системе. И там была рекомендация в 650 Вт в качестве минимума.
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    @AquariusStar Автор вопроса
    Алексей Павлов, в общем я решил это методом подписки всех элементов к одному методу, и там я проверяю циклом к какому ListBoxItem принадлежит полученный sender и выставляю SelectedIndex для ListBox значение. Но плюс есть. Теперь sender'ы проще обрабатывать.
    Спасибо большое за подробное объяснение! Уже проще понять механику ViewModel.
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    @AquariusStar Автор вопроса
    Алексей Павлов, ага, теперь уже гораздо интереснее. Я так понимаю, что должен подписываться к каждому элементу Item в ObservableCollection? Просто помню, что ранее отслеживал через изменения в ObservableCollection. Но сейчас почему-то не работает. Могу отслеживать только через отдельные элементы, которые находятся в ObservableCollection.
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    @AquariusStar Автор вопроса
    Алексей Павлов, да, вы правы. Он берёт Items из класса ItemsList. Я невнимательно прочёл. Теперь, он, как вы указали, вызвал исключение. Убрал их. Появилось, но показывает что-то не то. Вместо текста с тремя радиокнопками показывает путь к типу.
    5bd95bf9ed078716056704.png
    Где ExperienceUI_3.Libraries - пространство имён, а Item - собственно, класс, который вы представили в ответе.
    P.S. Теперь это работает. Оказывается, что нужно добавить в ItemTepmlate нужный DataTemplate. Я сейчас попробую с последним вариантом, которую вы предложили. Так как у меня DataTemplate может быть разным.

    SelectContext и ContentContext между собой конструктивно похожи: у последнего нету радиокнопок.
    <DataTemplate x:Key="SelectContext" DataType="{x:Type converters:Item}">
            <DataTemplate.Resources>
                <converters:IntToBooleanConverter x:Key="IntToBoolConverter"/>
            </DataTemplate.Resources>
            <Border x:Name="Data"
                    Height="40">
                <Grid x:Name="ContentBase"
                      Margin="1,0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Label Name="DisplayText"
                           Grid.Column="0"
                           Margin="0"
                           Padding="0"
                           HorizontalAlignment="Left"
                           Content="{Binding Name}"
                           Foreground="{Binding Foreground, RelativeSource={RelativeSource Mode=Self}}"/>
                    <RadioButton Name="_1"
                                 Grid.Column="1"
                                 Content="1"
                                 IsChecked="{Binding ItemMode, Converter={StaticResource IntToBoolConverter}, ConverterParameter=1}"
                                 IsEnabled="{Binding IsEnabled, RelativeSource={RelativeSource Mode=Self}}"
                                 Style="{StaticResource RadioButtonKeys}"/>
                    <RadioButton Name="_2"
                                 Grid.Column="2"
                                 Content="2"
                                 IsChecked="{Binding ItemMode, Converter={StaticResource IntToBoolConverter}, ConverterParameter=2}"
                                 IsEnabled="{Binding IsEnabled, RelativeSource={RelativeSource Mode=Self}}"
                                 Style="{StaticResource RadioButtonKeys}"/>
                    <RadioButton Name="_3"
                                 Grid.Column="3"
                                 Content="3"
                                 IsChecked="{Binding ItemMode, Converter={StaticResource IntToBoolConverter}, ConverterParameter=3}"
                                 IsEnabled="{Binding IsEnabled, RelativeSource={RelativeSource Mode=Self}}"
                                 Style="{StaticResource RadioButtonKeys}"/>
                </Grid>
            </Border>
        </DataTemplate>
    
        <DataTemplate x:Key="ContentContext" DataType="{x:Type converters:Item}">
            <DataTemplate.Resources>
                <converters:IntToBooleanConverter x:Key="IntToBoolConverter"/>
            </DataTemplate.Resources>
            <Border x:Name="Data"
                    Height="40">
                <Grid x:Name="ContentBase"
                      Margin="1,0">
                    <Label Name="DisplayText"
                           Margin="0"
                           Padding="0"
                           HorizontalAlignment="Left"
                           Content="{Binding Name}"
                           Foreground="{Binding Foreground, RelativeSource={RelativeSource Mode=Self}}"/>
                </Grid>
            </Border>
        </DataTemplate>
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    @AquariusStar Автор вопроса
    Алексей Павлов, в общем, после нескольких опытов случайно наткнулся на самый подходящий вариант, который ловит событие ButtonBase.Click в ListBoxItem. Он, оказывается, ловит нажатия радиокнопок, передавая все нужные значения в аргументах.
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    @AquariusStar Автор вопроса
    Здесь реализация возможна, как я понял, только в пределах UserControl/Window/Page? Просто IntToBoolConverter недоступен почему-то в словаре ресурсов (там DataTemplate расположен). Хоть и прописал для converters место расположения кода с классами. У меня такой вопрос есть. Если IsChecked одной радиокнопки находится в позиции true, и я нажму на радиокнопку в положение true, событие изменения всё равно произойдёт?

    P.S. Пришлось перенести
    <converters:IntToBooleanConverter x:Key="IntToBoolConverter"/>
    в <DataTemplate.Resources>. Только так он появился в списке.

    P.P.S.
    <ListBox Grid.Row="0"
                     Name="ListDevices"
                     Margin="-1"
                     ItemsSource="{Binding items}"
                     Background="Transparent"
                     BorderBrush="Transparent"
                     BorderThickness="0"
                     SelectionChanged="ProcessingSelect">
                <Separator Foreground="LightGray" Background="LightGray" Padding="0" Margin="0"/>
                <ListBoxItem Content="№ 1" ContentTemplate="{DynamicResource SelectContext}"/>
                <ListBoxItem Content="№ 2" ContentTemplate="{DynamicResource SelectContext}"/>
                <ListBoxItem Content="№ 3" ContentTemplate="{DynamicResource SelectContext}"/>
                <ListBoxItem Content="№ 4" ContentTemplate="{DynamicResource SelectContext}"/>
                <Separator Foreground="Black" Padding="0" Margin="0"/>
                <ListBoxItem Content="A" ContentTemplate="{DynamicResource ContentContext}"/>
            </ListBox>

    public Libraries.ItemsList items = new Libraries.ItemsList();
            public DevicesPanel()
            {
                InitializeComponent();
                ListDevices.DataContext = items;
                items.Items.CollectionChanged += Items_CollectionChanged;
            }

    Я добавил вот так. Но всё равно не происходит. Я что-то упускаю?
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    @AquariusStar Автор вопроса
    Алексей Павлов, DependencyProperty у меня используется в предыдущем проекте, но при этом там DataTemplate располагался в пределах стиля ListBoxItem. В текущем проекте хотел доработать, отделив DataTemplate от стиля ListBoxItem с расчётом возможности подключить другой DataTemplate, не меняя стиля. Предыдущий проект опирался на событие IsPressed, чтобы вызвать IsSelected и передать текущее свойство радиокнопок (так как они были недоступны напрямую из кода, приходилось реализовывать через прикрепляемое свойство), а в коде уже через событие Selected получаю нужное мне свойство.