#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:
Для сбора дополнительной информации вы можете выполнить следующие действия,
- Ваш отчет должен включать операционную систему.
- Версия и размер экрана.
- Информация о DPI, большинство пользователей устанавливают большой размер шрифта, это, вероятно, немного изменит dpi, в результате чего элементы управления будут отображаться немного по-другому.
- Версия WPF, а также проверьте значения свойств зависимости по умолчанию. Вы можете предположить, что вы установили для тиков значение false, но оно может быть true по умолчанию, или если ваш xaml запущен в каком-либо другом приложении, и ресурсы могут установить для него значение true.
- Пользователи могут использовать только клавиатуру и проверять, как клавиатура ведет себя для этих элементов управления.
- Пользователи могут дважды щелкнуть, у многих пользователей есть привычка дважды щелкать все (кнопки, ссылки)
- При меньших размерах экрана ваши элементы управления могут быть недоступны для просмотра, это очень маловероятно, поскольку вы получаете максимальные значения. Или даже на больших экранах изменение размера текста может привести к тому, что макет скроет ваши элементы управления.
Ответ №2:
Трудно сказать наверняка, является ли проблема классической темой, но у меня было много проблем с различными темами и WPF. Например, проецирование (на внешний дисплей) с помощью темы Aero почти всегда в конечном итоге приводит к некоторому необычному поведению с WPF. У меня также были похожие проблемы, которые, казалось, проявлялись больше на определенных видеокартах, чем на других. И не заставляйте меня начинать с LiveMeeting и WPF 🙂
Обязательно протестируйте classic theme и убедитесь, что вы тестируете и на XP.