Как убрать пунктирную линию в ComboBoxItem?

229
17 июня 2022, 17:30

Как убрать пунктирную линию в ComboBoxItem?

Она появляеться при нажатии и наведении.

ComboBox Tables = new ComboBox { FocusVisualStyle = null, HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(20, 10, 5, 0) };
Tables.ItemsSource = db.Query<string>("Select [Name] FROM TreeView WHERE Type = 'Table'").ToList();
TabContent.Children.Add(Tables);

Использую Dapper для доступа к базе данным.
Так же использую Material Design.

Answer 1

В WPF работать напрямую с контролами в C# - плохая практика, минусы данного подхода перечислять не буду, их очень много. Если кратко то сумма этих минусов даст вам в десятки раз больше работы, чем если вдумчиво подойти к вопросу, и использовать XAML и MVVM.

Если кратко, с привязкой данных, не распиливая код на классы (что в будущем рекомендуется сделать), то заведите свойство.

public sealed partial class MainWindow : Window, INotifyPropertyChanged
{
    private ObservableCollection<string> _myItems;
    public ObservableCollection<string> MyItems
    {
        get => _myItems;
        set
        {
            _myItems = value;
            OnPropertyChanged();
        }
    }
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this; // вот это важно, оно указывает, где Binding должен брать данные, как вы уже поняли, оно может указывать куда угодно, следовательно и данные могут быть в отдельном классе, где захотите
    }
    private void MainWindow_Loaded(object sender, RoutedEventArgs e) // в xaml окну добавьте Loaded="MainWindow_Loaded"
    {
        // ... ваш код, выполняемый при запуске приложения
        var items = db.Query<string>("Select [Name] FROM TreeView WHERE Type = 'Table'");
        MyItems = new ObservableCollection(items);
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

Далее можете делать с коллекцией MyItems что угодно, работать с ней можно почти так же как с List<string>. А ComboBox будет сам обновляться, когда состав коллекции поменяется, либо она будет заменена на другую, в реальном времени.

Способ привязки данных везде одинаковый, например вы можете точно так же привязать ComboBox.SelectedItem к свойству типа string. В сеттере можно вызывать свой код, то есть вам в этом случае не понадобится обработчик события SelectionChanged. (если надо показать - покажу, напишите об этом в комментарии)

В XAML стиль фокусировки можно обnullить так, через Style:

<ComboBox ItemsSource="{Binding MyItems}">
    <ComboBox.Style>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="HorizontalAlignment" Value="Stretch"/>
            <Setter Property="VerticalAlignment" Value="Top"/>
            <Setter Property="Margin" Value="20,10,5,0"/>
        </Style>
    </ComboBox.Style>
    <ComboBox.Resources>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        </Style>
    </ComboBox.Resources>
</ComboBox>
READ ALSO
Повторить символы в cтроке

Повторить символы в cтроке

Есть символЛюбой

356
C# WinForms Нужна помощь в унификация поиска процессов

C# WinForms Нужна помощь в унификация поиска процессов

Доброго времени суток программисты! В данный момент я пишу программу которая проверяет запущен-ли процесс Programm*****exe (Вместо звёздочек много...

325
Инкапсуляция. Принципы ООП

Инкапсуляция. Принципы ООП

Начал изучать объектно-ориентированное программированиеСо всеми принципами разобрался, но не могу до конца осмыслить, для чего нужна инкапсуляция

215
При перемещении exe+dll вылетает ошибка C#

При перемещении exe+dll вылетает ошибка C#

При запуске программы на моём пк всё нормально, но если запускать на другом, то выводит следующую ошибку

181