我有一個使用WPF和.NET 4.0 Client Profile創建的相對簡單的程序。我使用了一種MVVM方法,其中我使用最少的代碼隱藏視圖來綁定相應視圖模型上的屬性;那些屬性將根據需要訪問模型。 GUI包含複選框,滑塊和其他必要的控件。滑塊設置爲最小值爲0,最大值爲1,大變化爲0.1,小變化爲0.05。這對我和大多數人來說都很好。報告具有鎖定值的WPF控件的用戶;這怎麼會發生?
不幸的是,一些用戶報告了一些非常奇怪的問題。他們報告滑塊被鎖定到0或1的值,並且值不能被改變。通常情況下,滑塊的最小值爲0,最大值爲1,因此這些值可能是正確的(儘管它們最可能應該顯示0.5左右的值),但它們絕對應該可以調整!但是,我沒有設置IsSnapToTickEnabled;它的默認值爲false。滑塊綁定到視圖模型上的十進制屬性。我試圖向這些用戶詢問更多信息,但不幸的是很難與他們聯繫,所以我試圖自己解決。
我正在運行Windows 7 64位。我試圖通過更改視圖模型來實驗,以便將滑塊綁定到小於其最小值或高於其最大值的值,並且在這些情況下,滑塊通過簡單地顯示最小值或最大值並允許更改來處理它。我試圖通過更改視圖模型來嘗試,以便滑塊綁定到引發異常的屬性,在這種情況下,滑塊通過顯示最小值並允許更改來處理它。這表明綁定(因此,視圖模型和模型)不是問題,所以這個問題在某些事物的視角。我認爲這可能是一個風格沒有得到應用的問題,但即使是一個無風格的滑塊工作正常,並允許更改通常。
無論我做什麼,我都無法重現這些人正在報告的問題!因此,我來找你尋求幫助。 你能想到什麼可能導致這種情況的任何想法?據我所知,我沒有做任何不尋常的事情。我只是使用普通的WPF滑塊控件並綁定到小數屬性!
我知道至少有一個用戶正在使用經典主題,並且我在程序中強制使用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);
}
}