我有一个相对简单的程序,我使用WPF和.NET 4.0 Client Profile创建。我使用了MVVM方法,其中我有最小代码隐藏的视图,它绑定到相应视图模型上的属性;然后,这些属性会根据需要访问模型。 GUI根据需要包含复选框,滑块和其他控件。滑块设置为最小值为0,最大值为1,大变化为0.1,小变化为0.05。这对我和大多数人来说都很好。
不幸的是,有几个用户报告了一些非常奇怪的问题。他们报告滑块被锁定为0或1的值,并且无法更改值。通常情况下,滑块的最小值为0,最大值为1,因此值可能是正确的(尽管它们实际上应该显示的值大约为0.5左右),但它们肯定应该是可调节的!但是,我没有设置IsSnapToTickEnabled;它保留默认值false。滑块绑定到视图模型上的十进制属性。我曾尝试向这些用户询问更多信息,但遗憾的是很难与他们取得联系,所以我试图自己解决这个问题。
我正在运行Windows 7 64位。我尝试通过更改视图模型进行实验,以便滑块绑定到低于其最小值或高于其最大值的值,在这些情况下,滑块通过简单地显示最小值或最大值并允许更改来处理它。我尝试通过更改视图模型进行实验,以便滑块绑定到抛出异常的属性,在这种情况下,滑块通过显示最小值并允许更改来处理它。这告诉我,绑定(因此,视图模型和模型)不是问题,所以问题是在事物的观点方面。我认为这可能是一个没有应用的样式的问题,但即使是没有样式的滑块工作正常并允许正常更改。
无论我做什么,我都无法重现这些人报道的问题!因此,我来找你帮忙。 您能想到可能导致这种情况的任何想法吗?据我所知,我没有做任何不寻常的事情。我只是使用普通的WPF Slider控件并绑定到十进制属性!
我知道至少有一个获得这些问题的用户正在使用经典主题,如果这与任何相关性,我正在我的程序中强制使用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);
}
}
答案 0 :(得分:1)
您可以执行以下操作来收集更多信息,
答案 1 :(得分:0)
很难确定经典主题是否是问题,但我在各种主题和WPF方面遇到了很多问题。例如,使用Aero主题投影(到外部显示器)几乎总是会导致WPF出现一些奇怪的行为。我也有类似的问题,似乎在某些视频卡上比其他更多。不要让我开始使用LiveMeeting和WPF: - )
绝对测试经典主题,并确保你也在XP上测试。