2011-11-10 17 views
3

我有一個使用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); 
    } 

} 

回答

0

很難知道是否經典主題是問題,但我已經與各種主題和WPF的問題很多。例如,使用Aero主題投影(到外部顯示器)幾乎總是會最終導致WPF出現一些古怪的行爲。我也有類似的問題,似乎在某些顯卡上比其他顯卡更多。並且不要讓我開始使用LiveMeeting和WPF :-)

肯定會測試經典主題,並確保您也在XP上進行測試。

1

你可以做以下的事情來收集一些信息,

  1. 你的報告必須包括操作系統。
  2. 版本和屏幕大小。
  3. DPI信息,大多數用戶設置較高的字體大小,這可能會將dpi更改爲一點點,從而導致控件渲染方式稍有不同。
  4. WPF版本,並且還檢查默認的依賴屬性值。您可能會認爲您已將tick設置爲false,但默認情況下可能爲true,或者如果您的xaml正在某個其他應用中運行,並且資源可能會將其設置爲true。
  5. 用戶只能使用鍵盤,並檢查鍵盤對於這些控件的行爲。
  6. 用戶可以雙擊,很多用戶都雙擊一切的習慣(按鈕,鏈接)
  7. 在較小的屏幕尺寸,你的控制可能出的觀點,這是非常不可能的,你正在接受最大值。甚至在大屏幕上,更改文字大小可能會導致佈局隱藏控件。