报告WPF控件的用户具有锁定值;怎么会发生这种情况?

时间:2011-11-10 00:15:39

标签: c# .net wpf .net-4.0

我有一个相对简单的程序,我使用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);
    }

}

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作来收集更多信息,

  1. 您的报告必须包含操作系统。
  2. 版本和屏幕尺寸。
  3. DPI信息,大多数用户设置了较高的字体大小,这可能会将dpi改为一点点,导致控件渲染方式略有不同。
  4. WPF版本,还检查默认的依赖项属性值。您可以假设您已将tick设置为false,但默认情况下可能为true,或者如果您的xaml在其他应用程序中运行,并且资源可能将其设置为true。
  5. 用户只能使用键盘,并检查键盘对这些控件的行为方式。
  6. 用户可以双击,很多用户都有双击所有内容的习惯(按钮,链接)
  7. 在较小的屏幕尺寸中,您的控件可能不在视图中,因为您正在接收最大值,因此这种可能性很小。或者甚至在大屏幕上,更改文字大小可能会导致布局隐藏您的控件。

答案 1 :(得分:0)

很难确定经典主题是否是问题,但我在各种主题和WPF方面遇到了很多问题。例如,使用Aero主题投影(到外部显示器)几乎总是会导致WPF出现一些奇怪的行为。我也有类似的问题,似乎在某些视频卡上比其他更多。不要让我开始使用LiveMeeting和WPF: - )

绝对测试经典主题,并确保你也在XP上测试。