2016-11-19 3 views
0

Ich habe ein Problem mit dem Ändern der dynamischen Ressource Stil auf einem Steuerelement (in dem Beispiel ist es ein Datepicker, aber ich möchte es für viele verschiedene Steuerelemente ändern). Ich habe einen Stil für aktiviert und einen für deaktiviert und der deaktivierte Stil basiert auf dem aktivierten. Das funktioniert ein Vergnügen. Ich möchte in der Lage sein, den Stil zu ändern, wenn ich auf eine Schaltfläche klicke (aktiviert zu deaktiviert und umgekehrt), aber nach einigem Suchen funktioniert der Code, den ich mir ausgedacht habe, einfach nicht. C# Laufzeit ändern WPF dynamische Ressource

Dies ist die XAML im Ressourcenverzeichnis

<!--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> 

Dies ist der Code-behind ist es für Behinderte Stil zu ändern:

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

und für den aktivierten Stil

datepickerEDP.SetResourceReference(StyleProperty, "appDatePicker"); 

Der Fehler, den ich beim Ausführen dieses Codes erhalte, ist

System.Windows.Markup.XamlParseException aufgetreten HResult = -2146233087 Linenumber = 0 = 0 Lineposition Nachricht = A 'DynamicResourceExtension' kann nicht auf der 'BasedOn' Eigenschaft Typ 'Style' gesetzt werden. Eine 'DynamicResourceExtension' kann nur für eine DependencyProperty eines DependencyObject festgelegt werden.
Source = PresentationFramework Stacktrace: bei MS.Internal.Helper.CheckCanReceiveMarkupExtension (Markupextension Markupextension, IServiceProvider serviceprovider, DependencyObject & targetDependencyObject, DependencyProperty & targetDependencyProperty) Innerexception:

mir Dies zeigt an, dass ich Ich kann keinen Basiston-Stil verwenden, aber selbst wenn ich den deaktivierten Stil so geändert habe, dass er alle Elemente des aktivierten Stils enthält und das BasedOn-Tag entfernt hat, schlägt er immer noch fehl. Hat jemand irgendwelche Ideen, wo ich falsch liege? Dies tut man der Mutter wirklich in :(

+0

es statische Ressource machen 'BasedOn = "{Static appDatePicker}"'. ' 'bereits überschreibt Grundeinstellungen , 'DynamicResource' hat einen anderen Zweck: Es sollte die Ausnahme beheben, aber vielleicht ist ein anderer Ansatz wie die Verwendung von Style-Triggern sogar einfach r – ASh

+0

ASh das tut genau das, was ich brauche, danke. – BU00HA

Antwort

1

Sie nicht tatsächlich die Ressource-Referenz ändern möchten Verwenden Sie löst stattdessen.

<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.Triggers> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Foreground" Value="..."/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Wenn Sie den Wert der Eigenschaft IsEnabled wollen programmatisch Basis geändert werden bestimmten Bedingungen binden an eine Trägereigenschaft, die INotifyPropertyChanged implementiert.

+0

axlj, das ist perfekt, aber nicht für das, was ich tun möchte. Ich werde das aber in Zukunft nutzen. Danke für Ihre Hilfe. – BU00HA

+0

@ BU00HA Es klingt, als würden Sie gegen die Art und Weise arbeiten, wie WPF für die Verwendung entwickelt wurde. (gewährt, wenn es für dich funktioniert, dann geh dafür). In jedem Fall klingt es so, als ob Sie das Datepicker-Steuerelement mit Ihrer eigenen 'hasBeenClicked'-Eigenschaft erweitern möchten. Der Ansatz zum Festlegen der Ressourcenreferenz wird wahrscheinlich nicht realisierte Nebenwirkungen haben, die Sie erst nach Stunden zu debuggen versuchen. – axlj

Verwandte Themen