Пользователи сообщают об элементах управления WPF с заблокированными значениями; как это могло произойти?

#c# #.net #wpf #.net-4.0

#c# #.net #wpf #.net-4.0

Вопрос:

У меня есть относительно простая программа, которую я создал с использованием WPF и клиентского профиля .NET 4.0. Я использовал подход MVVM, где у меня есть представления с минимальным кодом, которые привязываются к свойствам в соответствующих моделях представлений; эти свойства затем получают доступ к модели по мере необходимости. Графический интерфейс содержит флажки, ползунки и другие элементы управления по мере необходимости. Для ползунков установлено минимальное значение 0, максимальное значение 1, большое изменение 0,1 и небольшое изменение 0,05. Все это отлично работает для меня и большинства людей.

К сожалению, несколько пользователей сообщили о некоторых очень странных проблемах. Они сообщают, что ползунки заблокированы на значении 0 или 1, и что значения не могут быть изменены. Обычно ползунки имеют минимальное значение 0 и максимальное значение 1, поэтому значения потенциально корректны (хотя, скорее всего, на самом деле они должны показывать значения 0,5 или около того), но они определенно должны быть регулируемыми! Однако я не устанавливаю IsSnapToTickEnabled; значение по умолчанию равно false. Ползунки привязаны к десятичным свойствам в view-моделях. Я пытался запросить у этих пользователей дополнительную информацию, но, к сожалению, с ними трудно связаться, поэтому я пытаюсь решить это самостоятельно.

Я использую 64-разрядную версию Windows 7. Я попытался поэкспериментировать, изменив view-model таким образом, чтобы ползунок привязывался к значению, меньшему, чем минимальное, или большему, чем максимальное, и в этих случаях ползунок прекрасно справляется с этим, просто показывая минимум или максимум и разрешая изменения. Я попытался поэкспериментировать, изменив view-model так, чтобы ползунок привязывался к свойству, которое генерирует исключение, и в этом случае ползунок отлично справляется с этим, показывая минимальное значение и разрешая изменения. Это наводит меня на мысль, что привязка (и, следовательно, view-model и модель) не является проблемой, и поэтому проблема находится где-то на стороне представления вещей. Я подумал, что это может быть проблема с тем, что стиль не применяется, но даже нестайлинговый слайдер работает нормально и допускает изменения в обычном режиме.

Что бы я ни делал, я не могу воспроизвести проблемы, о которых сообщают эти люди! Поэтому я пришел к вам за помощью. Можете ли вы придумать какие-либо идеи о том, что может быть причиной этого?Насколько я знаю, я не делаю ничего необычного. Я просто использую обычный элемент управления ползунком WPF и привязку к свойству decimal!

Я знаю, что по крайней мере один пользователь, у которого возникают эти проблемы, использует тему classic, и я использую тему Aero в своей программе, если это имеет какое-либо значение.

Вот несколько примеров кода, но я не думаю, что это будет очень полезно…

Привязка слайдера:

 public decimal TestBinding {
    get { return this.Model.Test; }
    set {
        if (this.Model.Test == value) return;
        this.Model.Test = value;
        this.OnPropertyChanged("TestBinding");
    }
}
  

Управление ползунком:

 <Slider Grid.Row="1"
        Grid.Column="1"
        Value="{Binding TestBinding}"
        Style="{StaticResource Slider0to1}" />
  

Стиль слайдера:

 <Style TargetType="Slider" BasedOn="{Utilities:StaticApplicationResource {x:Type Slider}}">
    <Setter Property="Margin" Value="0" />
    <Setter Property="VerticalAlignment" Value="Center" />
    <Setter Property="AutoToolTipPlacement" Value="TopLeft" />
    <Setter Property="AutoToolTipPrecision" Value="2" />
    <Setter Property="TickPlacement" Value="BottomRight" />
</Style>

<Style x:Key="Slider0to1" TargetType="Slider" BasedOn="{Utilities:StaticApplicationResource {x:Type Slider}}">
    <Setter Property="AutoToolTipPrecision" Value="2" />
    <Setter Property="Minimum" Value="0" />
    <Setter Property="Maximum" Value="1" />
    <Setter Property="TickFrequency" Value="0.1" />
    <Setter Property="SmallChange" Value="0.05" />
    <Setter Property="LargeChange" Value="0.1" />
</Style>
  

Расширение разметки StaticApplicationResource:

 [MarkupExtensionReturnType(typeof(object))]
public class StaticApplicationResource : MarkupExtension {

    public StaticApplicationResource(object resourceKey) {
        this.ResourceKey = resourceKey;
    }

    [ConstructorArgument("resourceKey")]
    public object ResourceKey { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider) {
        if (this.ResourceKey == null) return null;
        return Application.Current.TryFindResource(this.ResourceKey);
    }

}
  

Ответ №1:

Для сбора дополнительной информации вы можете выполнить следующие действия,

  1. Ваш отчет должен включать операционную систему.
  2. Версия и размер экрана.
  3. Информация о DPI, большинство пользователей устанавливают большой размер шрифта, это, вероятно, немного изменит dpi, в результате чего элементы управления будут отображаться немного по-другому.
  4. Версия WPF, а также проверьте значения свойств зависимости по умолчанию. Вы можете предположить, что вы установили для тиков значение false, но оно может быть true по умолчанию, или если ваш xaml запущен в каком-либо другом приложении, и ресурсы могут установить для него значение true.
  5. Пользователи могут использовать только клавиатуру и проверять, как клавиатура ведет себя для этих элементов управления.
  6. Пользователи могут дважды щелкнуть, у многих пользователей есть привычка дважды щелкать все (кнопки, ссылки)
  7. При меньших размерах экрана ваши элементы управления могут быть недоступны для просмотра, это очень маловероятно, поскольку вы получаете максимальные значения. Или даже на больших экранах изменение размера текста может привести к тому, что макет скроет ваши элементы управления.

Ответ №2:

Трудно сказать наверняка, является ли проблема классической темой, но у меня было много проблем с различными темами и WPF. Например, проецирование (на внешний дисплей) с помощью темы Aero почти всегда в конечном итоге приводит к некоторому необычному поведению с WPF. У меня также были похожие проблемы, которые, казалось, проявлялись больше на определенных видеокартах, чем на других. И не заставляйте меня начинать с LiveMeeting и WPF 🙂

Обязательно протестируйте classic theme и убедитесь, что вы тестируете и на XP.