Задать вопрос
Ответы пользователя по тегу WPF
  • Как узнать положение ползунка listbox'a wpf?

    @BlackGad
    .NET разработчик
    Можно подписаться на ScrollChangedEvent routed событие. Аргумент события ScrollChangedEventArgs имеет подробную информацию о скролле. Если этого мало - используйте OrigianSource свойство, которое указывает на ScrollViewer, у которого уже можно запросить текущие HorizontalOffset и VerticalOffset
    Ответ написан
    Комментировать
  • Как привязаться (binding) к перечислению (enum), исключив ненужные элементы?

    @BlackGad
    .NET разработчик
    Можно решить задачу создав свой ValueConverter, где как говорилось, выше фильтруем ненужные значения. Здесь же можно перепаковать при необходимости значение в свой расширенный тип (например из значения перечисления вытягивать атрибут Display и показывать имя, сортировать по порядку)

    Сам конвертер

    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Data;
    using System.Windows.Markup;
    
    namespace WpfApplication1
    {
        [ContentProperty("ExcludeValues")]
        class EnumValueSource : DependencyObject, IValueConverter
        {
            public static readonly DependencyProperty ExcludeValuesProperty =
                DependencyProperty.Register("ExcludeValues", typeof(ObservableCollection<object>), typeof(EnumValueSource), new PropertyMetadata(null, null, OnCoerceValue));
    
            private static object OnCoerceValue(DependencyObject d, object baseValue)
            {
                return baseValue ?? new ObservableCollection<object>();
            }
    
            public EnumValueSource()
            {
                CoerceValue(ExcludeValuesProperty);
            }
    
            public ObservableCollection<object> ExcludeValues
            {
                get { return (ObservableCollection<object>)GetValue(ExcludeValuesProperty); }
                set { SetValue(ExcludeValuesProperty, value); }
            }
    
            object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                var enumType = value as Type;
                if(enumType != null && enumType.IsEnum)
                {
                    return Enum.GetValues(enumType).OfType<object>().Except(ExcludeValues);
                }
    
                return Enumerable.Empty<object>();
            }
    
            object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotSupportedException();
            }
        }
    }


    Использование в WPF

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:local="clr-namespace:WpfApplication1"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            
            <local:EnumValueSource x:Key="VerticalAlignmentEnumSource">
                <VerticalAlignment>Center</VerticalAlignment>
                <VerticalAlignment>Top</VerticalAlignment>
            </local:EnumValueSource>
            
        </Window.Resources>
        
        <Grid VerticalAlignment="Center" HorizontalAlignment="Center">
            <ComboBox ItemsSource="{Binding Source={x:Type VerticalAlignment}, Converter={StaticResource VerticalAlignmentEnumSource}}">
                <ComboBox.SelectedItem>
                    <VerticalAlignment>Bottom</VerticalAlignment>
                </ComboBox.SelectedItem>
            </ComboBox>
        </Grid>
    </Window>
    Ответ написан
    Комментировать