2016-11-19 65 views
0

我在更改控件上的動態資源樣式時存在問題(例如它是日期選擇器,但我想更改它以適用於很多不同的控件)。我有一個啓用樣式和一個禁用樣式,殘疾人樣式基於啓用樣式。這是一種享受。我希望能夠在點擊按鈕時改變樣式(啓用禁用,反之亦然),但經過一些搜索後,我所提供的代碼無法正常工作。C#運行時更改WPF動態資源

這是在資源字典XAML

<!--DatePicker Resource--> 
<Style x:Key="appDatePicker" TargetType="{x:Type DatePicker}"> 
    <Setter Property="FontFamily" Value="{Binding Source={StaticResource userSettings}, Path=Default.userFontFamily}" /> 
    <Setter Property="FontSize" Value="{Binding Source={StaticResource userSettings}, Path=Default.userFontNormalSize}" /> 
    <Setter Property="Height" Value="Auto" /> 
    <Setter Property="MinWidth" Value="{Binding Source={StaticResource userSettings}, Path=Default.userControlWidth}" /> 
    <Setter Property="Background" Value="{Binding Source={StaticResource userSettings}, Path=Default.userControlBackground}" /> 
    <Setter Property="IsEnabled" Value="True"/> 
</Style> 

<!--DatePicker Disabled Resource--> 
<Style x:Key="appDatePickerDisabled" TargetType="{x:Type DatePicker}" BasedOn="{DynamicResource appDatePicker}"> 
    <Setter Property="IsEnabled" Value="False"/> 
</Style> 

這是後面的代碼將其更改爲殘疾人風格:

datepickerEDP.SetResourceReference(Control.StyleProperty, "appDatePickerDisabled"); 

和啓用風格

datepickerEDP.SetResourceReference(StyleProperty, "appDatePicker"); 

運行此代碼時出現的錯誤是

System.Windows.Markup.XamlParseException發生的HResult = -2146233087 LineNumber上= 0 LinePosition = 0消息= A 'DynamicResourceExtension' 不能被上 類型 '風格' 的 '支持算法FMP' 屬性設置。 'DynamicResourceExtension'只能在DependencyObject的DependencyProperty上設置。
源= PresentationFramework堆棧跟蹤: 在MS.Internal.Helper.CheckCanReceiveMarkupExtension(的MarkupExtension 的MarkupExtension,IServiceProvider的的ServiceProvider,DependencyObject的& targetDependencyObject,DependencyProperty的& targetDependencyProperty) 的InnerException:

這對我表明我不能使用基於樣式,但即使我已將禁用的樣式更改爲包含已啓用樣式上的所有內容並刪除了BasedOn標籤,它仍然會失敗。有沒有人有任何想法,我錯了?這是真正做一個人的螺母:(

+0

使其成爲靜態資源'BasedOn =「{StaticResource appDatePicker}」'。'已經覆蓋基本設置,''DynamicResource'有不同的目的,它應該修復這個異常,但是另外一種方法,比如使用樣式觸發器,可能會更簡單r – ASh

+0

因爲這正是我所需要的,謝謝。 – BU00HA

回答

1

你實際上並不想改變資源使用參考觸發器代替:如果你想IsEnabled屬性的值以編程方式更改基礎

​​

某些條件綁定到實現了INotifyPropertyChanged的支持屬性

+0

axlj,這是完美的,但不是我想要做的。我將在未來使用它。謝謝你的幫助。 – BU00HA

+0

@ BU00HA這聽起來像你可能會反對WPF被設計使用的方式。 (授予,如果它適合你,那就去做吧)。無論如何,這聽起來像你想用你自己的'hasBeenClicked'屬性來擴展datepicker控件。設置資源引用的方法很可能會產生未實現的副作用,您最終會在幾個小時後嘗試進行調試。 – axlj